1
1
using System ;
2
2
using System . Collections . Generic ;
3
- using System . Diagnostics ;
4
3
using System . Threading ;
5
4
using Microsoft . VisualStudio . TestTools . UnitTesting ;
6
5
using Moq ;
@@ -21,9 +20,59 @@ public class ChannelTest_Dispose_SessionIsConnectedAndChannelIsOpen_EofReceived
21
20
private uint _remotePacketSize ;
22
21
private ChannelStub _channel ;
23
22
private List < ChannelEventArgs > _channelClosedRegister ;
23
+ private List < ChannelEventArgs > _channelEndOfDataRegister ;
24
24
private IList < ExceptionEventArgs > _channelExceptionRegister ;
25
25
private ManualResetEvent _channelClosedReceived ;
26
26
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
+
27
76
[ TestInitialize ]
28
77
public void Initialize ( )
29
78
{
@@ -43,45 +92,13 @@ public void TearDown()
43
92
44
93
private void Arrange ( )
45
94
{
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 ( ) ;
82
98
83
99
_channel = new ChannelStub ( _sessionMock . Object , _localChannelNumber , _localWindowSize , _localPacketSize ) ;
84
100
_channel . Closed += ( sender , args ) => _channelClosedRegister . Add ( args ) ;
101
+ _channel . EndOfData += ( sender , args ) => _channelEndOfDataRegister . Add ( args ) ;
85
102
_channel . Exception += ( sender , args ) => _channelExceptionRegister . Add ( args ) ;
86
103
_channel . InitializeRemoteChannelInfo ( _remoteChannelNumber , _remoteWindowSize , _remotePacketSize ) ;
87
104
_channel . SetIsOpen ( true ) ;
@@ -137,6 +154,13 @@ public void ClosedEventShouldHaveFiredOnce()
137
154
Assert . AreEqual ( _localChannelNumber , _channelClosedRegister [ 0 ] . ChannelNumber ) ;
138
155
}
139
156
157
+ [ TestMethod ]
158
+ public void EndOfDataEventShouldHaveFiredOnce ( )
159
+ {
160
+ Assert . AreEqual ( 1 , _channelEndOfDataRegister . Count ) ;
161
+ Assert . AreEqual ( _localChannelNumber , _channelEndOfDataRegister [ 0 ] . ChannelNumber ) ;
162
+ }
163
+
140
164
[ TestMethod ]
141
165
public void ExceptionShouldNeverHaveFired ( )
142
166
{
0 commit comments