11using System ;
22using System . Collections . Generic ;
3- using System . Diagnostics ;
43using System . Threading ;
54using Microsoft . VisualStudio . TestTools . UnitTesting ;
65using 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