Skip to content

Commit d9b9e03

Browse files
committed
Reintroduce internal Channel.SendEof method.
1 parent e7ff062 commit d9b9e03

13 files changed

+414
-56
lines changed

Renci.SshClient/Renci.SshNet.Tests/Classes/Channels/ChannelTest_Close_SessionIsConnectedAndChannelIsNotOpen.cs

Lines changed: 10 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -17,6 +17,7 @@ public class ChannelTest_Close_SessionIsConnectedAndChannelIsNotOpen
1717
private uint _localChannelNumber;
1818
private Channel _channel;
1919
private List<ChannelEventArgs> _channelClosedRegister;
20+
private IList<ExceptionEventArgs> _channelExceptionRegister;
2021

2122
[TestInitialize]
2223
public void Initialize()
@@ -32,19 +33,15 @@ private void Arrange()
3233
_localWindowSize = (uint)random.Next(0, int.MaxValue);
3334
_localPacketSize = (uint)random.Next(0, int.MaxValue);
3435
_channelClosedRegister = new List<ChannelEventArgs>();
36+
_channelExceptionRegister = new List<ExceptionEventArgs>();
3537

3638
_sessionMock = new Mock<ISession>(MockBehavior.Strict);
3739

3840
_sessionMock.Setup(p => p.IsConnected).Returns(true);
3941

4042
_channel = new ChannelStub(_sessionMock.Object, _localChannelNumber, _localWindowSize, _localPacketSize);
41-
_channel.Closed += (sender, args) =>
42-
{
43-
lock (this)
44-
{
45-
_channelClosedRegister.Add(args);
46-
}
47-
};
43+
_channel.Closed += (sender, args) => _channelClosedRegister.Add(args);
44+
_channel.Exception += (sender, args) => _channelExceptionRegister.Add(args);
4845
}
4946

5047
private void Act()
@@ -69,5 +66,11 @@ public void ClosedEventShouldNeverHaveFired()
6966
{
7067
Assert.AreEqual(0, _channelClosedRegister.Count);
7168
}
69+
70+
[TestMethod]
71+
public void ExceptionShouldNeverHaveFired()
72+
{
73+
Assert.AreEqual(0, _channelExceptionRegister.Count);
74+
}
7275
}
7376
}

Renci.SshClient/Renci.SshNet.Tests/Classes/Channels/ChannelTest_Close_SessionIsConnectedAndChannelIsOpen_EofNotReceived.cs

Lines changed: 10 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -22,6 +22,7 @@ public class ChannelTest_Close_SessionIsConnectedAndChannelIsOpen_EofNotReceived
2222
private ChannelStub _channel;
2323
private Stopwatch _closeTimer;
2424
private List<ChannelEventArgs> _channelClosedRegister;
25+
private IList<ExceptionEventArgs> _channelExceptionRegister;
2526

2627
[TestInitialize]
2728
public void Initialize()
@@ -41,6 +42,7 @@ private void Arrange()
4142
_remotePacketSize = (uint)random.Next(0, int.MaxValue);
4243
_closeTimer = new Stopwatch();
4344
_channelClosedRegister = new List<ChannelEventArgs>();
45+
_channelExceptionRegister = new List<ExceptionEventArgs>();
4446

4547
_sessionMock = new Mock<ISession>(MockBehavior.Strict);
4648

@@ -74,13 +76,8 @@ private void Arrange()
7476
});
7577

7678
_channel = new ChannelStub(_sessionMock.Object, _localChannelNumber, _localWindowSize, _localPacketSize);
77-
_channel.Closed += (sender, args) =>
78-
{
79-
lock (this)
80-
{
81-
_channelClosedRegister.Add(args);
82-
}
83-
};
79+
_channel.Closed += (sender, args) => _channelClosedRegister.Add(args);
80+
_channel.Exception += (sender, args) => _channelExceptionRegister.Add(args);
8481
_channel.InitializeRemoteChannelInfo(_remoteChannelNumber, _remoteWindowSize, _remotePacketSize);
8582
_channel.SetIsOpen(true);
8683
}
@@ -130,5 +127,11 @@ public void ClosedEventShouldHaveFiredOnce()
130127
Assert.AreEqual(1, _channelClosedRegister.Count);
131128
Assert.AreEqual(_localChannelNumber, _channelClosedRegister[0].ChannelNumber);
132129
}
130+
131+
[TestMethod]
132+
public void ExceptionShouldNeverHaveFired()
133+
{
134+
Assert.AreEqual(0, _channelExceptionRegister.Count);
135+
}
133136
}
134137
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,137 @@
1+
using System;
2+
using System.Collections.Generic;
3+
using System.Diagnostics;
4+
using System.Threading;
5+
using Microsoft.VisualStudio.TestTools.UnitTesting;
6+
using Moq;
7+
using Renci.SshNet.Common;
8+
using Renci.SshNet.Messages.Connection;
9+
10+
namespace Renci.SshNet.Tests.Classes.Channels
11+
{
12+
[TestClass]
13+
public class ChannelTest_Close_SessionIsConnectedAndChannelIsOpen_EofNotReceived_SendEofInvoked
14+
{
15+
private Mock<ISession> _sessionMock;
16+
private uint _localChannelNumber;
17+
private uint _localWindowSize;
18+
private uint _localPacketSize;
19+
private uint _remoteChannelNumber;
20+
private uint _remoteWindowSize;
21+
private uint _remotePacketSize;
22+
private ChannelStub _channel;
23+
private Stopwatch _closeTimer;
24+
private List<ChannelEventArgs> _channelClosedRegister;
25+
private IList<ExceptionEventArgs> _channelExceptionRegister;
26+
27+
[TestInitialize]
28+
public void Initialize()
29+
{
30+
Arrange();
31+
Act();
32+
}
33+
34+
private void Arrange()
35+
{
36+
var random = new Random();
37+
_localChannelNumber = (uint)random.Next(0, int.MaxValue);
38+
_localWindowSize = (uint)random.Next(0, int.MaxValue);
39+
_localPacketSize = (uint)random.Next(0, int.MaxValue);
40+
_remoteChannelNumber = (uint)random.Next(0, int.MaxValue);
41+
_remoteWindowSize = (uint)random.Next(0, int.MaxValue);
42+
_remotePacketSize = (uint)random.Next(0, int.MaxValue);
43+
_closeTimer = new Stopwatch();
44+
_channelClosedRegister = new List<ChannelEventArgs>();
45+
_channelExceptionRegister = new List<ExceptionEventArgs>();
46+
47+
_sessionMock = new Mock<ISession>(MockBehavior.Strict);
48+
49+
var sequence = new MockSequence();
50+
_sessionMock.InSequence(sequence).Setup(p => p.SendMessage(It.Is<ChannelEofMessage>(c => c.LocalChannelNumber == _remoteChannelNumber)));
51+
_sessionMock.InSequence(sequence).Setup(p => p.IsConnected).Returns(true);
52+
_sessionMock.InSequence(sequence).Setup(p => p.TrySendMessage(It.Is<ChannelCloseMessage>(c => c.LocalChannelNumber == _remoteChannelNumber))).Returns(true);
53+
_sessionMock.InSequence(sequence).Setup(p => p.WaitOnHandle(It.IsAny<EventWaitHandle>()))
54+
.Callback<WaitHandle>(w =>
55+
{
56+
new Thread(() =>
57+
{
58+
Thread.Sleep(100);
59+
// raise ChannelCloseReceived event to set waithandle for receiving
60+
// SSH_MSG_CHANNEL_CLOSE message from server which is waited on after
61+
// sending the SSH_MSG_CHANNEL_CLOSE message to the server
62+
_sessionMock.Raise(s => s.ChannelCloseReceived += null,
63+
new MessageEventArgs<ChannelCloseMessage>(
64+
new ChannelCloseMessage(_localChannelNumber)));
65+
}).Start();
66+
_closeTimer.Start();
67+
try
68+
{
69+
w.WaitOne();
70+
}
71+
finally
72+
{
73+
_closeTimer.Stop();
74+
}
75+
});
76+
77+
_channel = new ChannelStub(_sessionMock.Object, _localChannelNumber, _localWindowSize, _localPacketSize);
78+
_channel.Closed += (sender, args) => _channelClosedRegister.Add(args);
79+
_channel.Exception += (sender, args) => _channelExceptionRegister.Add(args);
80+
_channel.InitializeRemoteChannelInfo(_remoteChannelNumber, _remoteWindowSize, _remotePacketSize);
81+
_channel.SetIsOpen(true);
82+
_channel.SendEof();
83+
}
84+
85+
private void Act()
86+
{
87+
_channel.Close();
88+
}
89+
90+
[TestMethod]
91+
public void IsOpenShouldReturnFalse()
92+
{
93+
Assert.IsFalse(_channel.IsOpen);
94+
}
95+
96+
[TestMethod]
97+
public void TrySendMessageOnSessionShouldBeInvokedOnceForChannelCloseMessage()
98+
{
99+
_sessionMock.Verify(
100+
p => p.TrySendMessage(It.Is<ChannelCloseMessage>(c => c.LocalChannelNumber == _remoteChannelNumber)),
101+
Times.Once);
102+
}
103+
104+
[TestMethod]
105+
public void SendMessageOnSessionShouldBeInvokedOnceForChannelEofMessage()
106+
{
107+
_sessionMock.Verify(
108+
p => p.SendMessage(It.Is<ChannelEofMessage>(c => c.LocalChannelNumber == _remoteChannelNumber)),
109+
Times.Once);
110+
}
111+
112+
[TestMethod]
113+
public void WaitOnHandleOnSessionShouldBeInvokedOnce()
114+
{
115+
_sessionMock.Verify(p => p.WaitOnHandle(It.IsAny<EventWaitHandle>()), Times.Once);
116+
}
117+
118+
[TestMethod]
119+
public void WaitOnHandleOnSessionShouldWaitForChannelCloseMessageToBeReceived()
120+
{
121+
Assert.IsTrue(_closeTimer.ElapsedMilliseconds >= 100, "Elapsed milliseconds=" + _closeTimer.ElapsedMilliseconds);
122+
}
123+
124+
[TestMethod]
125+
public void ClosedEventShouldHaveFiredOnce()
126+
{
127+
Assert.AreEqual(1, _channelClosedRegister.Count);
128+
Assert.AreEqual(_localChannelNumber, _channelClosedRegister[0].ChannelNumber);
129+
}
130+
131+
[TestMethod]
132+
public void ExceptionShouldNeverHaveFired()
133+
{
134+
Assert.AreEqual(0, _channelExceptionRegister.Count);
135+
}
136+
}
137+
}

Renci.SshClient/Renci.SshNet.Tests/Classes/Channels/ChannelTest_Close_SessionIsConnectedAndChannelIsOpen_EofReceived.cs

Lines changed: 10 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -22,6 +22,7 @@ public class ChannelTest_Close_SessionIsConnectedAndChannelIsOpen_EofReceived
2222
private ChannelStub _channel;
2323
private Stopwatch _closeTimer;
2424
private List<ChannelEventArgs> _channelClosedRegister;
25+
private IList<ExceptionEventArgs> _channelExceptionRegister;
2526

2627
[TestInitialize]
2728
public void Initialize()
@@ -41,6 +42,7 @@ private void Arrange()
4142
_remotePacketSize = (uint)random.Next(0, int.MaxValue);
4243
_closeTimer = new Stopwatch();
4344
_channelClosedRegister = new List<ChannelEventArgs>();
45+
_channelExceptionRegister = new List<ExceptionEventArgs>();
4446

4547
_sessionMock = new Mock<ISession>(MockBehavior.Strict);
4648

@@ -72,13 +74,8 @@ private void Arrange()
7274
});
7375

7476
_channel = new ChannelStub(_sessionMock.Object, _localChannelNumber, _localWindowSize, _localPacketSize);
75-
_channel.Closed += (sender, args) =>
76-
{
77-
lock (this)
78-
{
79-
_channelClosedRegister.Add(args);
80-
}
81-
};
77+
_channel.Closed += (sender, args) => _channelClosedRegister.Add(args);
78+
_channel.Exception += (sender, args) => _channelExceptionRegister.Add(args);
8279
_channel.InitializeRemoteChannelInfo(_remoteChannelNumber, _remoteWindowSize, _remotePacketSize);
8380
_channel.SetIsOpen(true);
8481

@@ -132,5 +129,11 @@ public void ClosedEventShouldHaveFiredOnce()
132129
Assert.AreEqual(1, _channelClosedRegister.Count);
133130
Assert.AreEqual(_localChannelNumber, _channelClosedRegister[0].ChannelNumber);
134131
}
132+
133+
[TestMethod]
134+
public void ExceptionShouldNeverHaveFired()
135+
{
136+
Assert.AreEqual(0, _channelExceptionRegister.Count);
137+
}
135138
}
136139
}

Renci.SshClient/Renci.SshNet.Tests/Classes/Channels/ChannelTest_Close_SessionIsNotConnectedAndChannelIsNotOpen.cs

Lines changed: 10 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -17,6 +17,7 @@ public class ChannelTest_Close_SessionIsNotConnectedAndChannelIsNotOpen
1717
private uint _localChannelNumber;
1818
private Channel _channel;
1919
private List<ChannelEventArgs> _channelClosedRegister;
20+
private IList<ExceptionEventArgs> _channelExceptionRegister;
2021

2122
[TestInitialize]
2223
public void Initialize()
@@ -32,19 +33,15 @@ private void Arrange()
3233
_localWindowSize = (uint) random.Next(0, int.MaxValue);
3334
_localPacketSize = (uint) random.Next(0, int.MaxValue);
3435
_channelClosedRegister = new List<ChannelEventArgs>();
36+
_channelExceptionRegister = new List<ExceptionEventArgs>();
3537

3638
_sessionMock = new Mock<ISession>(MockBehavior.Strict);
3739

3840
_sessionMock.Setup(p => p.IsConnected).Returns(false);
3941

4042
_channel = new ChannelStub(_sessionMock.Object, _localChannelNumber, _localWindowSize, _localPacketSize);
41-
_channel.Closed += (sender, args) =>
42-
{
43-
lock (this)
44-
{
45-
_channelClosedRegister.Add(args);
46-
}
47-
};
43+
_channel.Closed += (sender, args) => _channelClosedRegister.Add(args);
44+
_channel.Exception += (sender, args) => _channelExceptionRegister.Add(args);
4845
}
4946

5047
private void Act()
@@ -69,5 +66,11 @@ public void ClosedEventShouldNeverHaveFired()
6966
{
7067
Assert.AreEqual(0, _channelClosedRegister.Count);
7168
}
69+
70+
[TestMethod]
71+
public void ExceptionShouldNeverHaveFired()
72+
{
73+
Assert.AreEqual(0, _channelExceptionRegister.Count);
74+
}
7275
}
7376
}

Renci.SshClient/Renci.SshNet.Tests/Classes/Channels/ChannelTest_Close_SessionIsNotConnectedAndChannelIsOpen.cs

Lines changed: 10 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -16,6 +16,7 @@ public class ChannelTest_Close_SessionIsNotConnectedAndChannelIsOpen
1616
private uint _localChannelNumber;
1717
private ChannelStub _channel;
1818
private List<ChannelEventArgs> _channelClosedRegister;
19+
private IList<ExceptionEventArgs> _channelExceptionRegister;
1920

2021
[TestInitialize]
2122
public void Initialize()
@@ -31,19 +32,15 @@ private void Arrange()
3132
_localWindowSize = (uint)random.Next(0, int.MaxValue);
3233
_localPacketSize = (uint)random.Next(0, int.MaxValue);
3334
_channelClosedRegister = new List<ChannelEventArgs>();
35+
_channelExceptionRegister = new List<ExceptionEventArgs>();
3436

3537
_sessionMock = new Mock<ISession>(MockBehavior.Strict);
3638

3739
_sessionMock.Setup(p => p.IsConnected).Returns(false);
3840

3941
_channel = new ChannelStub(_sessionMock.Object, _localChannelNumber, _localWindowSize, _localPacketSize);
40-
_channel.Closed += (sender, args) =>
41-
{
42-
lock (this)
43-
{
44-
_channelClosedRegister.Add(args);
45-
}
46-
};
42+
_channel.Closed += (sender, args) => _channelClosedRegister.Add(args);
43+
_channel.Exception += (sender, args) => _channelExceptionRegister.Add(args);
4744
_channel.SetIsOpen(true);
4845
}
4946

@@ -69,5 +66,11 @@ public void ClosedEventShouldNeverHaveFired()
6966
{
7067
Assert.AreEqual(0, _channelClosedRegister.Count);
7168
}
69+
70+
[TestMethod]
71+
public void ExceptionShouldNeverHaveFired()
72+
{
73+
Assert.AreEqual(0, _channelExceptionRegister.Count);
74+
}
7275
}
7376
}

Renci.SshClient/Renci.SshNet.Tests/Classes/Channels/ChannelTest_OnSessionChannelCloseReceived_SessionIsConnectedAndChannelIsOpen_EofNotReceived.cs

Lines changed: 10 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -19,6 +19,7 @@ public class ChannelTest_OnSessionChannelCloseReceived_SessionIsConnectedAndChan
1919
private uint _remoteWindowSize;
2020
private uint _remotePacketSize;
2121
private IList<ChannelEventArgs> _channelClosedRegister;
22+
private IList<ExceptionEventArgs> _channelExceptionRegister;
2223
private ChannelStub _channel;
2324

2425
[TestInitialize]
@@ -38,20 +39,16 @@ private void Arrange()
3839
_remoteWindowSize = (uint)random.Next(0, int.MaxValue);
3940
_remotePacketSize = (uint)random.Next(0, int.MaxValue);
4041
_channelClosedRegister = new List<ChannelEventArgs>();
42+
_channelExceptionRegister = new List<ExceptionEventArgs>();
4143

4244
_sessionMock = new Mock<ISession>(MockBehavior.Strict);
4345

4446
_sessionMock.Setup(p => p.IsConnected).Returns(true);
4547
_sessionMock.Setup(p => p.TrySendMessage(It.Is<ChannelCloseMessage>(c => c.LocalChannelNumber == _remoteChannelNumber))).Returns(true);
4648

4749
_channel = new ChannelStub(_sessionMock.Object, _localChannelNumber, _localWindowSize, _localPacketSize);
48-
_channel.Closed += (sender, args) =>
49-
{
50-
lock (this)
51-
{
52-
_channelClosedRegister.Add(args);
53-
}
54-
};
50+
_channel.Closed += (sender, args) => _channelClosedRegister.Add(args);
51+
_channel.Exception += (sender, args) => _channelExceptionRegister.Add(args);
5552
_channel.InitializeRemoteChannelInfo(_remoteChannelNumber, _remoteWindowSize, _remotePacketSize);
5653
_channel.SetIsOpen(true);
5754
}
@@ -96,5 +93,11 @@ public void ClosedEventShouldHaveFiredOnce()
9693
Assert.AreEqual(1, _channelClosedRegister.Count);
9794
Assert.AreEqual(_localChannelNumber, _channelClosedRegister[0].ChannelNumber);
9895
}
96+
97+
[TestMethod]
98+
public void ExceptionShouldNeverHaveFired()
99+
{
100+
Assert.AreEqual(0, _channelExceptionRegister.Count);
101+
}
99102
}
100103
}

0 commit comments

Comments
 (0)