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

+2-2
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);
+2-2
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

+2-2
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

+3-3
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
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]
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]
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]
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]
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]
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]
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_NoChannelCloseOrChannelEofReceived
13+
public class ChannelSessionTest_Dispose_SessionIsConnectedAndChannelIsOpen_NoChannelCloseOrChannelEofReceived
1414
{
1515
private Mock<ISession> _sessionMock;
1616
private Mock<IConnectionInfo> _connectionInfoMock;
@@ -105,7 +105,7 @@ private void Arrange()
105105

106106
private void Act()
107107
{
108-
_channel.Close();
108+
_channel.Dispose();
109109
}
110110

111111
[TestMethod]
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_NoChannelCloseOrChannelEofReceived_SendChannelEofMessageFailure
13+
public class ChannelSessionTest_Dispose_SessionIsConnectedAndChannelIsOpen_NoChannelCloseOrChannelEofReceived_SendChannelEofMessageFailure
1414
{
1515
private Mock<ISession> _sessionMock;
1616
private Mock<IConnectionInfo> _connectionInfoMock;
@@ -105,7 +105,7 @@ private void Arrange()
105105

106106
private void Act()
107107
{
108-
_channel.Close();
108+
_channel.Dispose();
109109
}
110110

111111
[TestMethod]
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_SessionIsNotConnectedAndChannelIsOpen_ChannelCloseAndChannelEofReceived
13+
public class ChannelSessionTest_Dispose_SessionIsNotConnectedAndChannelIsOpen_ChannelCloseAndChannelEofReceived
1414
{
1515
private Mock<ISession> _sessionMock;
1616
private uint _localChannelNumber;
@@ -96,7 +96,7 @@ private void Arrange()
9696

9797
private void Act()
9898
{
99-
_channel.Close();
99+
_channel.Dispose();
100100
}
101101

102102
[TestMethod]
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_SessionIsNotConnectedAndChannelIsOpen_ChannelCloseReceived
13+
public class ChannelSessionTest_Dispose_SessionIsNotConnectedAndChannelIsOpen_ChannelCloseReceived
1414
{
1515
private Mock<ISession> _sessionMock;
1616
private uint _localChannelNumber;
@@ -93,7 +93,7 @@ private void Arrange()
9393

9494
private void Act()
9595
{
96-
_channel.Close();
96+
_channel.Dispose();
9797
}
9898

9999
[TestMethod]
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_SessionIsNotConnectedAndChannelIsOpen_NoChannelCloseOrChannelEofReceived
13+
public class ChannelSessionTest_Dispose_SessionIsNotConnectedAndChannelIsOpen_NoChannelCloseOrChannelEofReceived
1414
{
1515
private Mock<ISession> _sessionMock;
1616
private uint _localChannelNumber;
@@ -89,7 +89,7 @@ private void Arrange()
8989

9090
private void Act()
9191
{
92-
_channel.Close();
92+
_channel.Dispose();
9393
}
9494

9595
[TestMethod]

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

+1-1
Original file line numberDiff line numberDiff line change
@@ -3,7 +3,7 @@
33
namespace Renci.SshNet.Tests.Classes.Channels
44
{
55
[TestClass]
6-
public class ChannelSessionTest_Disposed_Closed : ChannelSessionTest_Close_Closed
6+
public class ChannelSessionTest_Disposed_Closed : ChannelSessionTest_Dispose_Disposed
77
{
88
protected override void Act()
99
{

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

+6-2
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,7 @@
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
{
@@ -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);
@@ -107,7 +111,7 @@ public void CurrentCountOfSessionSemaphoreShouldBeEqualToInitialCount()
107111
[TestMethod]
108112
public void ExceptionShouldNeverHaveFired()
109113
{
110-
Assert.AreEqual(0, _channelExceptionRegister.Count);
114+
Assert.AreEqual(0, _channelExceptionRegister.Count, _channelExceptionRegister.AsString());
111115
}
112116

113117
[TestMethod]

src/Renci.SshNet.Tests/Classes/Channels/ChannelTest_Close_SessionIsConnectedAndChannelIsNotOpen.cs renamed to src/Renci.SshNet.Tests/Classes/Channels/ChannelTest_Dispose_SessionIsConnectedAndChannelIsNotOpen.cs

+2-2
Original file line numberDiff line numberDiff line change
@@ -9,7 +9,7 @@
99
namespace Renci.SshNet.Tests.Classes.Channels
1010
{
1111
[TestClass]
12-
public class ChannelTest_Close_SessionIsConnectedAndChannelIsNotOpen
12+
public class ChannelTest_Dispose_SessionIsConnectedAndChannelIsNotOpen
1313
{
1414
private Mock<ISession> _sessionMock;
1515
private uint _localWindowSize;
@@ -46,7 +46,7 @@ private void Arrange()
4646

4747
private void Act()
4848
{
49-
_channel.Close();
49+
_channel.Dispose();
5050
}
5151

5252
[TestMethod]

0 commit comments

Comments
 (0)