Skip to content

Commit

Permalink
Send SSH_MSG_CHANNEL_EOF and SSH_MSG_CHANNEL_CLOSE in synchronized bl…
Browse files Browse the repository at this point in the history
…ock.

Fixes issue #84.

Eliminate public Close() method and its use within SSH.NET.
Remove wait bool from protected Close(bool) method.
The protected Close() method will now always wait for a  SSH_MSG_CHANNEL_CLOSE if the client initiated closing the channel.
  • Loading branch information
drieseng committed Sep 10, 2016
1 parent b413970 commit 1d6177f
Show file tree
Hide file tree
Showing 90 changed files with 283 additions and 508 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -195,7 +195,7 @@ public void SocketShouldBeClosedAndEofShouldBeSentToServerWhenClientShutsDownSoc
_localPacketSize);
channel.Open(_remoteHost, _port, _forwardedPortMock.Object, socket);
channel.Bind();
channel.Close();
channel.Dispose();

handler = socket;

Expand All @@ -215,7 +215,7 @@ public void SocketShouldBeClosedAndEofShouldBeSentToServerWhenClientShutsDownSoc
_sessionMock.Verify(p => p.TrySendMessage(It.IsAny<ChannelEofMessage>()), Times.Once);
_sessionMock.Verify(p => p.TrySendMessage(It.IsAny<ChannelCloseMessage>()), Times.Once);

channel.Close();
channel.Dispose();

_sessionMock.Verify(p => p.TrySendMessage(It.IsAny<ChannelEofMessage>()), Times.Once);
_sessionMock.Verify(p => p.TrySendMessage(It.IsAny<ChannelCloseMessage>()), Times.Once);
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -12,7 +12,7 @@
namespace Renci.SshNet.Tests.Classes.Channels
{
[TestClass]
public class ChannelDirectTcpipTest_Close_SessionIsConnectedAndChannelIsOpen
public class ChannelDirectTcpipTest_Dispose_SessionIsConnectedAndChannelIsOpen
{
private Mock<ISession> _sessionMock;
private Mock<IForwardedPort> _forwardedPortMock;
Expand Down Expand Up @@ -165,7 +165,7 @@ private void Act()
{
if (_channel != null)
{
_channel.Close();
_channel.Dispose();
}
}

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -13,7 +13,7 @@
namespace Renci.SshNet.Tests.Classes.Channels
{
[TestClass]
public class ChannelForwardedTcpipTest_Close_SessionIsConnectedAndChannelIsOpen
public class ChannelForwardedTcpipTest_Dispose_SessionIsConnectedAndChannelIsOpen
{
private Mock<ISession> _sessionMock;
private Mock<IForwardedPort> _forwardedPortMock;
Expand Down Expand Up @@ -157,7 +157,7 @@ private void Arrange()

private void Act()
{
_channel.Close();
_channel.Dispose();
}

[TestMethod]
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -10,7 +10,7 @@
namespace Renci.SshNet.Tests.Classes.Channels
{
[TestClass]
public class ChannelSessionTest_Close_Closed
public class ChannelSessionTest_Dispose_Disposed
{
private Mock<ISession> _sessionMock;
private Mock<IConnectionInfo> _connectionInfoMock;
Expand Down Expand Up @@ -97,12 +97,12 @@ private void Arrange()
_channel.Closed += (sender, args) => _channelClosedRegister.Add(args);
_channel.Exception += (sender, args) => _channelExceptionRegister.Add(args);
_channel.Open();
_channel.Close();
_channel.Dispose();
}

protected virtual void Act()
{
_channel.Close();
_channel.Dispose();
}

internal ChannelSession Channel
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -10,7 +10,7 @@
namespace Renci.SshNet.Tests.Classes.Channels
{
[TestClass]
public class ChannelSessionTest_Close_SessionIsConnectedAndChannelIsOpen_ChannelCloseAndChannelEofReceived_SendChannelCloseMessageFailure
public class ChannelSessionTest_Dispose_SessionIsConnectedAndChannelIsOpen_ChannelCloseAndChannelEofReceived_SendChannelCloseMessageFailure
{
private Mock<ISession> _sessionMock;
private uint _localChannelNumber;
Expand Down Expand Up @@ -100,7 +100,7 @@ private void Arrange()

private void Act()
{
_channel.Close();
_channel.Dispose();
}

[TestMethod]
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -6,11 +6,12 @@
using Renci.SshNet.Channels;
using Renci.SshNet.Common;
using Renci.SshNet.Messages.Connection;
using Renci.SshNet.Tests.Common;

namespace Renci.SshNet.Tests.Classes.Channels
{
[TestClass]
public class ChannelSessionTest_Close_SessionIsConnectedAndChannelIsOpen_ChannelCloseAndChannelEofReceived_SendChannelCloseMessageSuccess
public class ChannelSessionTest_Dispose_SessionIsConnectedAndChannelIsOpen_ChannelCloseAndChannelEofReceived_SendChannelCloseMessageSuccess
{
private Mock<ISession> _sessionMock;
private uint _localChannelNumber;
Expand Down Expand Up @@ -79,11 +80,14 @@ private void Arrange()
_remoteChannelNumber)));
w.WaitOne();
});
_sessionMock.Setup(p => p.IsConnected).Returns(true);
_sessionMock.InSequence(_sequence).Setup(p => p.IsConnected).Returns(true);
_sessionMock.InSequence(_sequence)
.Setup(
p => p.TrySendMessage(It.Is<ChannelCloseMessage>(c => c.LocalChannelNumber == _remoteChannelNumber)))
.Returns(true);
_sessionMock.InSequence(_sequence)
.Setup(s => s.WaitOnHandle(It.IsNotNull<EventWaitHandle>()))
.Callback<WaitHandle>(w => w.WaitOne());

_channel = new ChannelSession(_sessionMock.Object, _localChannelNumber, _localWindowSize, _localPacketSize);
_channel.Closed += (sender, args) => _channelClosedRegister.Add(args);
Expand All @@ -100,7 +104,7 @@ private void Arrange()

private void Act()
{
_channel.Close();
_channel.Dispose();
}

[TestMethod]
Expand All @@ -112,7 +116,7 @@ public void CurrentCountOfSessionSemaphoreShouldBeEqualToInitialCount()
[TestMethod]
public void ExceptionShouldNeverHaveFired()
{
Assert.AreEqual(0, _channelExceptionRegister.Count);
Assert.AreEqual(0, _channelExceptionRegister.Count, _channelExceptionRegister.AsString());
}

[TestMethod]
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -10,7 +10,7 @@
namespace Renci.SshNet.Tests.Classes.Channels
{
[TestClass]
public class ChannelSessionTest_Close_SessionIsConnectedAndChannelIsOpen_ChannelCloseReceived_SendChannelCloseMessageFailure
public class ChannelSessionTest_Dispose_SessionIsConnectedAndChannelIsOpen_ChannelCloseReceived_SendChannelCloseMessageFailure
{
private Mock<ISession> _sessionMock;
private uint _localChannelNumber;
Expand Down Expand Up @@ -97,7 +97,7 @@ private void Arrange()

private void Act()
{
_channel.Close();
_channel.Dispose();
}

[TestMethod]
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -6,11 +6,12 @@
using Renci.SshNet.Channels;
using Renci.SshNet.Common;
using Renci.SshNet.Messages.Connection;
using Renci.SshNet.Tests.Common;

namespace Renci.SshNet.Tests.Classes.Channels
{
[TestClass]
public class ChannelSessionTest_Close_SessionIsConnectedAndChannelIsOpen_ChannelCloseReceived_SendChannelCloseMessageSuccess
public class ChannelSessionTest_Dispose_SessionIsConnectedAndChannelIsOpen_ChannelCloseReceived_SendChannelCloseMessageSuccess
{
private Mock<ISession> _sessionMock;
private uint _localChannelNumber;
Expand Down Expand Up @@ -79,11 +80,14 @@ private void Arrange()
_remoteChannelNumber)));
w.WaitOne();
});
_sessionMock.Setup(p => p.IsConnected).Returns(true);
_sessionMock.InSequence(_sequence).Setup(p => p.IsConnected).Returns(true);
_sessionMock.InSequence(_sequence)
.Setup(
p => p.TrySendMessage(It.Is<ChannelCloseMessage>(c => c.LocalChannelNumber == _remoteChannelNumber)))
.Returns(true);
_sessionMock.InSequence(_sequence)
.Setup(s => s.WaitOnHandle(It.IsNotNull<EventWaitHandle>()))
.Callback<WaitHandle>(w => w.WaitOne());

_channel = new ChannelSession(_sessionMock.Object, _localChannelNumber, _localWindowSize, _localPacketSize);
_channel.Closed += (sender, args) => _channelClosedRegister.Add(args);
Expand All @@ -97,7 +101,7 @@ private void Arrange()

private void Act()
{
_channel.Close();
_channel.Dispose();
}

[TestMethod]
Expand All @@ -109,7 +113,7 @@ public void CurrentCountOfSessionSemaphoreShouldBeEqualToInitialCount()
[TestMethod]
public void ExceptionShouldNeverHaveFired()
{
Assert.AreEqual(0, _channelExceptionRegister.Count);
Assert.AreEqual(0, _channelExceptionRegister.Count, _channelExceptionRegister.AsString());
}

[TestMethod]
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -10,7 +10,7 @@
namespace Renci.SshNet.Tests.Classes.Channels
{
[TestClass]
public class ChannelSessionTest_Close_SessionIsConnectedAndChannelIsOpen_ChannelEofReceived_SendChannelCloseMessageFailure
public class ChannelSessionTest_Dispose_SessionIsConnectedAndChannelIsOpen_ChannelEofReceived_SendChannelCloseMessageFailure
{
private Mock<ISession> _sessionMock;
private uint _localChannelNumber;
Expand Down Expand Up @@ -97,7 +97,7 @@ private void Arrange()

private void Act()
{
_channel.Close();
_channel.Dispose();
}

[TestMethod]
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -10,7 +10,7 @@
namespace Renci.SshNet.Tests.Classes.Channels
{
[TestClass]
public class ChannelSessionTest_Close_SessionIsConnectedAndChannelIsOpen_ChannelEofReceived_SendChannelCloseMessageSuccess
public class ChannelSessionTest_Dispose_SessionIsConnectedAndChannelIsOpen_ChannelEofReceived_SendChannelCloseMessageSuccess
{
private Mock<ISession> _sessionMock;
private uint _localChannelNumber;
Expand Down Expand Up @@ -107,7 +107,7 @@ private void Arrange()

private void Act()
{
_channel.Close();
_channel.Dispose();
}

[TestMethod]
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -10,7 +10,7 @@
namespace Renci.SshNet.Tests.Classes.Channels
{
[TestClass]
public class ChannelSessionTest_Close_SessionIsConnectedAndChannelIsOpen_NoChannelCloseOrChannelEofReceived
public class ChannelSessionTest_Dispose_SessionIsConnectedAndChannelIsOpen_NoChannelCloseOrChannelEofReceived
{
private Mock<ISession> _sessionMock;
private Mock<IConnectionInfo> _connectionInfoMock;
Expand Down Expand Up @@ -105,7 +105,7 @@ private void Arrange()

private void Act()
{
_channel.Close();
_channel.Dispose();
}

[TestMethod]
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -10,7 +10,7 @@
namespace Renci.SshNet.Tests.Classes.Channels
{
[TestClass]
public class ChannelSessionTest_Close_SessionIsConnectedAndChannelIsOpen_NoChannelCloseOrChannelEofReceived_SendChannelEofMessageFailure
public class ChannelSessionTest_Dispose_SessionIsConnectedAndChannelIsOpen_NoChannelCloseOrChannelEofReceived_SendChannelEofMessageFailure
{
private Mock<ISession> _sessionMock;
private Mock<IConnectionInfo> _connectionInfoMock;
Expand Down Expand Up @@ -105,7 +105,7 @@ private void Arrange()

private void Act()
{
_channel.Close();
_channel.Dispose();
}

[TestMethod]
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -10,7 +10,7 @@
namespace Renci.SshNet.Tests.Classes.Channels
{
[TestClass]
public class ChannelSessionTest_Close_SessionIsNotConnectedAndChannelIsOpen_ChannelCloseAndChannelEofReceived
public class ChannelSessionTest_Dispose_SessionIsNotConnectedAndChannelIsOpen_ChannelCloseAndChannelEofReceived
{
private Mock<ISession> _sessionMock;
private uint _localChannelNumber;
Expand Down Expand Up @@ -96,7 +96,7 @@ private void Arrange()

private void Act()
{
_channel.Close();
_channel.Dispose();
}

[TestMethod]
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -10,7 +10,7 @@
namespace Renci.SshNet.Tests.Classes.Channels
{
[TestClass]
public class ChannelSessionTest_Close_SessionIsNotConnectedAndChannelIsOpen_ChannelCloseReceived
public class ChannelSessionTest_Dispose_SessionIsNotConnectedAndChannelIsOpen_ChannelCloseReceived
{
private Mock<ISession> _sessionMock;
private uint _localChannelNumber;
Expand Down Expand Up @@ -93,7 +93,7 @@ private void Arrange()

private void Act()
{
_channel.Close();
_channel.Dispose();
}

[TestMethod]
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -10,7 +10,7 @@
namespace Renci.SshNet.Tests.Classes.Channels
{
[TestClass]
public class ChannelSessionTest_Close_SessionIsNotConnectedAndChannelIsOpen_NoChannelCloseOrChannelEofReceived
public class ChannelSessionTest_Dispose_SessionIsNotConnectedAndChannelIsOpen_NoChannelCloseOrChannelEofReceived
{
private Mock<ISession> _sessionMock;
private uint _localChannelNumber;
Expand Down Expand Up @@ -89,7 +89,7 @@ private void Arrange()

private void Act()
{
_channel.Close();
_channel.Dispose();
}

[TestMethod]
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -3,7 +3,7 @@
namespace Renci.SshNet.Tests.Classes.Channels
{
[TestClass]
public class ChannelSessionTest_Disposed_Closed : ChannelSessionTest_Close_Closed
public class ChannelSessionTest_Disposed_Closed : ChannelSessionTest_Dispose_Disposed
{
protected override void Act()
{
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -6,6 +6,7 @@
using Renci.SshNet.Channels;
using Renci.SshNet.Common;
using Renci.SshNet.Messages.Connection;
using Renci.SshNet.Tests.Common;

namespace Renci.SshNet.Tests.Classes.Channels
{
Expand Down Expand Up @@ -79,11 +80,14 @@ private void Arrange()
_remoteChannelNumber)));
w.WaitOne();
});
_sessionMock.Setup(p => p.IsConnected).Returns(true);
_sessionMock.InSequence(_sequence).Setup(p => p.IsConnected).Returns(true);
_sessionMock.InSequence(_sequence)
.Setup(
p => p.TrySendMessage(It.Is<ChannelCloseMessage>(c => c.LocalChannelNumber == _remoteChannelNumber)))
.Returns(true);
_sessionMock.InSequence(_sequence)
.Setup(s => s.WaitOnHandle(It.IsNotNull<EventWaitHandle>()))
.Callback<WaitHandle>(w => w.WaitOne());

_channel = new ChannelSession(_sessionMock.Object, _localChannelNumber, _localWindowSize, _localPacketSize);
_channel.Closed += (sender, args) => _channelClosedRegister.Add(args);
Expand All @@ -107,7 +111,7 @@ public void CurrentCountOfSessionSemaphoreShouldBeEqualToInitialCount()
[TestMethod]
public void ExceptionShouldNeverHaveFired()
{
Assert.AreEqual(0, _channelExceptionRegister.Count);
Assert.AreEqual(0, _channelExceptionRegister.Count, _channelExceptionRegister.AsString());
}

[TestMethod]
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -9,7 +9,7 @@
namespace Renci.SshNet.Tests.Classes.Channels
{
[TestClass]
public class ChannelTest_Close_SessionIsConnectedAndChannelIsNotOpen
public class ChannelTest_Dispose_SessionIsConnectedAndChannelIsNotOpen
{
private Mock<ISession> _sessionMock;
private uint _localWindowSize;
Expand Down Expand Up @@ -46,7 +46,7 @@ private void Arrange()

private void Act()
{
_channel.Close();
_channel.Dispose();
}

[TestMethod]
Expand Down
Loading

0 comments on commit 1d6177f

Please sign in to comment.