Skip to content

Commit 55d9109

Browse files
committed
Attempt to harden test.
1 parent e434f97 commit 55d9109

File tree

1 file changed

+61
-37
lines changed

1 file changed

+61
-37
lines changed

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

Lines changed: 61 additions & 37 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,5 @@
11
using System;
22
using System.Collections.Generic;
3-
using System.Diagnostics;
43
using System.Threading;
54
using Microsoft.VisualStudio.TestTools.UnitTesting;
65
using Moq;
@@ -21,9 +20,59 @@ public class ChannelTest_Dispose_SessionIsConnectedAndChannelIsOpen_EofReceived
2120
private uint _remotePacketSize;
2221
private ChannelStub _channel;
2322
private List<ChannelEventArgs> _channelClosedRegister;
23+
private List<ChannelEventArgs> _channelEndOfDataRegister;
2424
private IList<ExceptionEventArgs> _channelExceptionRegister;
2525
private ManualResetEvent _channelClosedReceived;
2626

27+
private void SetupData()
28+
{
29+
var random = new Random();
30+
31+
_localChannelNumber = (uint) random.Next(0, int.MaxValue);
32+
_localWindowSize = (uint) random.Next(0, int.MaxValue);
33+
_localPacketSize = (uint) random.Next(0, int.MaxValue);
34+
_remoteChannelNumber = (uint) random.Next(0, int.MaxValue);
35+
_remoteWindowSize = (uint) random.Next(0, int.MaxValue);
36+
_remotePacketSize = (uint) random.Next(0, int.MaxValue);
37+
_channelClosedRegister = new List<ChannelEventArgs>();
38+
_channelEndOfDataRegister = new List<ChannelEventArgs>();
39+
_channelExceptionRegister = new List<ExceptionEventArgs>();
40+
_channelClosedReceived = new ManualResetEvent(false);
41+
}
42+
43+
private void CreateMocks()
44+
{
45+
_sessionMock = new Mock<ISession>(MockBehavior.Strict);
46+
}
47+
48+
private void SetupMocks()
49+
{
50+
var sequence = new MockSequence();
51+
52+
_sessionMock.InSequence(sequence).Setup(p => p.IsConnected).Returns(true);
53+
_sessionMock.InSequence(sequence).Setup(p => p.TrySendMessage(It.Is<ChannelCloseMessage>(c => c.LocalChannelNumber == _remoteChannelNumber))).Returns(true);
54+
_sessionMock.InSequence(sequence).Setup(p => p.WaitOnHandle(It.IsAny<EventWaitHandle>()))
55+
.Callback<WaitHandle>(w =>
56+
{
57+
new Thread(() =>
58+
{
59+
Thread.Sleep(100);
60+
// raise ChannelCloseReceived event to set waithandle for receiving
61+
// SSH_MSG_CHANNEL_CLOSE message from server which is waited on after
62+
// sending the SSH_MSG_CHANNEL_CLOSE message to the server
63+
//
64+
// we're mocking the wait on the ChannelCloseMessage, but we still want
65+
// to get the channel in the state that it would have after actually receiving
66+
// the ChannelCloseMessage
67+
_sessionMock.Raise(s => s.ChannelCloseReceived += null, new MessageEventArgs<ChannelCloseMessage>(new ChannelCloseMessage(_localChannelNumber)));
68+
// signal that the ChannelCloseMessage was received; we use this to verify whether we've actually
69+
// waited on the EventWaitHandle to be set
70+
_channelClosedReceived.Set();
71+
}).Start();
72+
w.WaitOne();
73+
});
74+
}
75+
2776
[TestInitialize]
2877
public void Initialize()
2978
{
@@ -43,45 +92,13 @@ public void TearDown()
4392

4493
private void Arrange()
4594
{
46-
var random = new Random();
47-
_localChannelNumber = (uint)random.Next(0, int.MaxValue);
48-
_localWindowSize = (uint)random.Next(0, int.MaxValue);
49-
_localPacketSize = (uint)random.Next(0, int.MaxValue);
50-
_remoteChannelNumber = (uint)random.Next(0, int.MaxValue);
51-
_remoteWindowSize = (uint)random.Next(0, int.MaxValue);
52-
_remotePacketSize = (uint)random.Next(0, int.MaxValue);
53-
_channelClosedRegister = new List<ChannelEventArgs>();
54-
_channelExceptionRegister = new List<ExceptionEventArgs>();
55-
_channelClosedReceived = new ManualResetEvent(false);
56-
57-
_sessionMock = new Mock<ISession>(MockBehavior.Strict);
58-
59-
var sequence = new MockSequence();
60-
_sessionMock.InSequence(sequence).Setup(p => p.IsConnected).Returns(true);
61-
_sessionMock.InSequence(sequence).Setup(p => p.TrySendMessage(It.Is<ChannelCloseMessage>(c => c.LocalChannelNumber == _remoteChannelNumber))).Returns(true);
62-
_sessionMock.InSequence(sequence).Setup(p => p.WaitOnHandle(It.IsAny<EventWaitHandle>()))
63-
.Callback<WaitHandle>(w =>
64-
{
65-
new Thread(() =>
66-
{
67-
Thread.Sleep(100);
68-
// signal that the ChannelCloseMessage was received; we use this to verify whether we've actually
69-
// waited on the EventWaitHandle to be set
70-
_channelClosedReceived.Set();
71-
// raise ChannelCloseReceived event to set waithandle for receiving
72-
// SSH_MSG_CHANNEL_CLOSE message from server which is waited on after
73-
// sending the SSH_MSG_CHANNEL_CLOSE message to the server
74-
//
75-
// we're mocking the wait on the ChannelCloseMessage, but we still want
76-
// to get the channel in the state that it would have after actually receiving
77-
// the ChannelCloseMessage
78-
_sessionMock.Raise(s => s.ChannelCloseReceived += null, new MessageEventArgs<ChannelCloseMessage>(new ChannelCloseMessage(_localChannelNumber)));
79-
}).Start();
80-
w.WaitOne();
81-
});
95+
SetupData();
96+
CreateMocks();
97+
SetupMocks();
8298

8399
_channel = new ChannelStub(_sessionMock.Object, _localChannelNumber, _localWindowSize, _localPacketSize);
84100
_channel.Closed += (sender, args) => _channelClosedRegister.Add(args);
101+
_channel.EndOfData += (sender, args) => _channelEndOfDataRegister.Add(args);
85102
_channel.Exception += (sender, args) => _channelExceptionRegister.Add(args);
86103
_channel.InitializeRemoteChannelInfo(_remoteChannelNumber, _remoteWindowSize, _remotePacketSize);
87104
_channel.SetIsOpen(true);
@@ -137,6 +154,13 @@ public void ClosedEventShouldHaveFiredOnce()
137154
Assert.AreEqual(_localChannelNumber, _channelClosedRegister[0].ChannelNumber);
138155
}
139156

157+
[TestMethod]
158+
public void EndOfDataEventShouldHaveFiredOnce()
159+
{
160+
Assert.AreEqual(1, _channelEndOfDataRegister.Count);
161+
Assert.AreEqual(_localChannelNumber, _channelEndOfDataRegister[0].ChannelNumber);
162+
}
163+
140164
[TestMethod]
141165
public void ExceptionShouldNeverHaveFired()
142166
{

0 commit comments

Comments
 (0)