Skip to content

Commit 1d6177f

Browse files
committed
Send SSH_MSG_CHANNEL_EOF and SSH_MSG_CHANNEL_CLOSE in synchronized block.
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.
1 parent b413970 commit 1d6177f

File tree

90 files changed

+283
-508
lines changed

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

90 files changed

+283
-508
lines changed

src/Renci.SshNet.Tests/Classes/Channels/ChannelDirectTcpipTest.cs

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -195,7 +195,7 @@ public void SocketShouldBeClosedAndEofShouldBeSentToServerWhenClientShutsDownSoc
195195
_localPacketSize);
196196
channel.Open(_remoteHost, _port, _forwardedPortMock.Object, socket);
197197
channel.Bind();
198-
channel.Close();
198+
channel.Dispose();
199199

200200
handler = socket;
201201

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

218-
channel.Close();
218+
channel.Dispose();
219219

220220
_sessionMock.Verify(p => p.TrySendMessage(It.IsAny<ChannelEofMessage>()), Times.Once);
221221
_sessionMock.Verify(p => p.TrySendMessage(It.IsAny<ChannelCloseMessage>()), Times.Once);
Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -12,7 +12,7 @@
1212
namespace Renci.SshNet.Tests.Classes.Channels
1313
{
1414
[TestClass]
15-
public class ChannelDirectTcpipTest_Close_SessionIsConnectedAndChannelIsOpen
15+
public class ChannelDirectTcpipTest_Dispose_SessionIsConnectedAndChannelIsOpen
1616
{
1717
private Mock<ISession> _sessionMock;
1818
private Mock<IForwardedPort> _forwardedPortMock;
@@ -165,7 +165,7 @@ private void Act()
165165
{
166166
if (_channel != null)
167167
{
168-
_channel.Close();
168+
_channel.Dispose();
169169
}
170170
}
171171

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -13,7 +13,7 @@
1313
namespace Renci.SshNet.Tests.Classes.Channels
1414
{
1515
[TestClass]
16-
public class ChannelForwardedTcpipTest_Close_SessionIsConnectedAndChannelIsOpen
16+
public class ChannelForwardedTcpipTest_Dispose_SessionIsConnectedAndChannelIsOpen
1717
{
1818
private Mock<ISession> _sessionMock;
1919
private Mock<IForwardedPort> _forwardedPortMock;
@@ -157,7 +157,7 @@ private void Arrange()
157157

158158
private void Act()
159159
{
160-
_channel.Close();
160+
_channel.Dispose();
161161
}
162162

163163
[TestMethod]

src/Renci.SshNet.Tests/Classes/Channels/ChannelSessionTest_Close_Closed.cs renamed to src/Renci.SshNet.Tests/Classes/Channels/ChannelSessionTest_Dispose_Disposed.cs

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -10,7 +10,7 @@
1010
namespace Renci.SshNet.Tests.Classes.Channels
1111
{
1212
[TestClass]
13-
public class ChannelSessionTest_Close_Closed
13+
public class ChannelSessionTest_Dispose_Disposed
1414
{
1515
private Mock<ISession> _sessionMock;
1616
private Mock<IConnectionInfo> _connectionInfoMock;
@@ -97,12 +97,12 @@ private void Arrange()
9797
_channel.Closed += (sender, args) => _channelClosedRegister.Add(args);
9898
_channel.Exception += (sender, args) => _channelExceptionRegister.Add(args);
9999
_channel.Open();
100-
_channel.Close();
100+
_channel.Dispose();
101101
}
102102

103103
protected virtual void Act()
104104
{
105-
_channel.Close();
105+
_channel.Dispose();
106106
}
107107

108108
internal ChannelSession Channel
Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -10,7 +10,7 @@
1010
namespace Renci.SshNet.Tests.Classes.Channels
1111
{
1212
[TestClass]
13-
public class ChannelSessionTest_Close_SessionIsConnectedAndChannelIsOpen_ChannelCloseAndChannelEofReceived_SendChannelCloseMessageFailure
13+
public class ChannelSessionTest_Dispose_SessionIsConnectedAndChannelIsOpen_ChannelCloseAndChannelEofReceived_SendChannelCloseMessageFailure
1414
{
1515
private Mock<ISession> _sessionMock;
1616
private uint _localChannelNumber;
@@ -100,7 +100,7 @@ private void Arrange()
100100

101101
private void Act()
102102
{
103-
_channel.Close();
103+
_channel.Dispose();
104104
}
105105

106106
[TestMethod]
Lines changed: 8 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -6,11 +6,12 @@
66
using Renci.SshNet.Channels;
77
using Renci.SshNet.Common;
88
using Renci.SshNet.Messages.Connection;
9+
using Renci.SshNet.Tests.Common;
910

1011
namespace Renci.SshNet.Tests.Classes.Channels
1112
{
1213
[TestClass]
13-
public class ChannelSessionTest_Close_SessionIsConnectedAndChannelIsOpen_ChannelCloseAndChannelEofReceived_SendChannelCloseMessageSuccess
14+
public class ChannelSessionTest_Dispose_SessionIsConnectedAndChannelIsOpen_ChannelCloseAndChannelEofReceived_SendChannelCloseMessageSuccess
1415
{
1516
private Mock<ISession> _sessionMock;
1617
private uint _localChannelNumber;
@@ -79,11 +80,14 @@ private void Arrange()
7980
_remoteChannelNumber)));
8081
w.WaitOne();
8182
});
82-
_sessionMock.Setup(p => p.IsConnected).Returns(true);
83+
_sessionMock.InSequence(_sequence).Setup(p => p.IsConnected).Returns(true);
8384
_sessionMock.InSequence(_sequence)
8485
.Setup(
8586
p => p.TrySendMessage(It.Is<ChannelCloseMessage>(c => c.LocalChannelNumber == _remoteChannelNumber)))
8687
.Returns(true);
88+
_sessionMock.InSequence(_sequence)
89+
.Setup(s => s.WaitOnHandle(It.IsNotNull<EventWaitHandle>()))
90+
.Callback<WaitHandle>(w => w.WaitOne());
8791

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

101105
private void Act()
102106
{
103-
_channel.Close();
107+
_channel.Dispose();
104108
}
105109

106110
[TestMethod]
@@ -112,7 +116,7 @@ public void CurrentCountOfSessionSemaphoreShouldBeEqualToInitialCount()
112116
[TestMethod]
113117
public void ExceptionShouldNeverHaveFired()
114118
{
115-
Assert.AreEqual(0, _channelExceptionRegister.Count);
119+
Assert.AreEqual(0, _channelExceptionRegister.Count, _channelExceptionRegister.AsString());
116120
}
117121

118122
[TestMethod]
Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -10,7 +10,7 @@
1010
namespace Renci.SshNet.Tests.Classes.Channels
1111
{
1212
[TestClass]
13-
public class ChannelSessionTest_Close_SessionIsConnectedAndChannelIsOpen_ChannelCloseReceived_SendChannelCloseMessageFailure
13+
public class ChannelSessionTest_Dispose_SessionIsConnectedAndChannelIsOpen_ChannelCloseReceived_SendChannelCloseMessageFailure
1414
{
1515
private Mock<ISession> _sessionMock;
1616
private uint _localChannelNumber;
@@ -97,7 +97,7 @@ private void Arrange()
9797

9898
private void Act()
9999
{
100-
_channel.Close();
100+
_channel.Dispose();
101101
}
102102

103103
[TestMethod]
Lines changed: 8 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -6,11 +6,12 @@
66
using Renci.SshNet.Channels;
77
using Renci.SshNet.Common;
88
using Renci.SshNet.Messages.Connection;
9+
using Renci.SshNet.Tests.Common;
910

1011
namespace Renci.SshNet.Tests.Classes.Channels
1112
{
1213
[TestClass]
13-
public class ChannelSessionTest_Close_SessionIsConnectedAndChannelIsOpen_ChannelCloseReceived_SendChannelCloseMessageSuccess
14+
public class ChannelSessionTest_Dispose_SessionIsConnectedAndChannelIsOpen_ChannelCloseReceived_SendChannelCloseMessageSuccess
1415
{
1516
private Mock<ISession> _sessionMock;
1617
private uint _localChannelNumber;
@@ -79,11 +80,14 @@ private void Arrange()
7980
_remoteChannelNumber)));
8081
w.WaitOne();
8182
});
82-
_sessionMock.Setup(p => p.IsConnected).Returns(true);
83+
_sessionMock.InSequence(_sequence).Setup(p => p.IsConnected).Returns(true);
8384
_sessionMock.InSequence(_sequence)
8485
.Setup(
8586
p => p.TrySendMessage(It.Is<ChannelCloseMessage>(c => c.LocalChannelNumber == _remoteChannelNumber)))
8687
.Returns(true);
88+
_sessionMock.InSequence(_sequence)
89+
.Setup(s => s.WaitOnHandle(It.IsNotNull<EventWaitHandle>()))
90+
.Callback<WaitHandle>(w => w.WaitOne());
8791

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

98102
private void Act()
99103
{
100-
_channel.Close();
104+
_channel.Dispose();
101105
}
102106

103107
[TestMethod]
@@ -109,7 +113,7 @@ public void CurrentCountOfSessionSemaphoreShouldBeEqualToInitialCount()
109113
[TestMethod]
110114
public void ExceptionShouldNeverHaveFired()
111115
{
112-
Assert.AreEqual(0, _channelExceptionRegister.Count);
116+
Assert.AreEqual(0, _channelExceptionRegister.Count, _channelExceptionRegister.AsString());
113117
}
114118

115119
[TestMethod]
Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -10,7 +10,7 @@
1010
namespace Renci.SshNet.Tests.Classes.Channels
1111
{
1212
[TestClass]
13-
public class ChannelSessionTest_Close_SessionIsConnectedAndChannelIsOpen_ChannelEofReceived_SendChannelCloseMessageFailure
13+
public class ChannelSessionTest_Dispose_SessionIsConnectedAndChannelIsOpen_ChannelEofReceived_SendChannelCloseMessageFailure
1414
{
1515
private Mock<ISession> _sessionMock;
1616
private uint _localChannelNumber;
@@ -97,7 +97,7 @@ private void Arrange()
9797

9898
private void Act()
9999
{
100-
_channel.Close();
100+
_channel.Dispose();
101101
}
102102

103103
[TestMethod]
Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -10,7 +10,7 @@
1010
namespace Renci.SshNet.Tests.Classes.Channels
1111
{
1212
[TestClass]
13-
public class ChannelSessionTest_Close_SessionIsConnectedAndChannelIsOpen_ChannelEofReceived_SendChannelCloseMessageSuccess
13+
public class ChannelSessionTest_Dispose_SessionIsConnectedAndChannelIsOpen_ChannelEofReceived_SendChannelCloseMessageSuccess
1414
{
1515
private Mock<ISession> _sessionMock;
1616
private uint _localChannelNumber;
@@ -107,7 +107,7 @@ private void Arrange()
107107

108108
private void Act()
109109
{
110-
_channel.Close();
110+
_channel.Dispose();
111111
}
112112

113113
[TestMethod]

0 commit comments

Comments
 (0)