Skip to content

Commit 47aafb1

Browse files
authored
Merge pull request #315 from sshnet/develop
Prepare for 2016.1.0-beta4.
2 parents cdf50d2 + 7a19bcd commit 47aafb1

File tree

38 files changed

+2152
-228
lines changed

38 files changed

+2152
-228
lines changed

build/nuget/SSH.NET.nuspec

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -2,15 +2,15 @@
22
<package xmlns="http://schemas.microsoft.com/packaging/2011/08/nuspec.xsd">
33
<metadata>
44
<id>SSH.NET</id>
5-
<version>2016.1.0-beta3</version>
5+
<version>2016.1.0-beta4</version>
66
<title>SSH.NET</title>
77
<authors>Renci</authors>
88
<owners>olegkap,drieseng</owners>
99
<licenseUrl>https://github.com/sshnet/SSH.NET/blob/master/LICENSE</licenseUrl>
1010
<projectUrl>https://github.com/sshnet/SSH.NET/</projectUrl>
1111
<requireLicenseAcceptance>false</requireLicenseAcceptance>
1212
<description>SSH.NET is a Secure Shell (SSH) library for .NET, optimized for parallelism and with broad framework support.</description>
13-
<releaseNotes>https://github.com/sshnet/SSH.NET/releases/tag/2016.1.0-beta3</releaseNotes>
13+
<releaseNotes>https://github.com/sshnet/SSH.NET/releases/tag/2016.1.0-beta4</releaseNotes>
1414
<summary>A Secure Shell (SSH) library for .NET, optimized for parallelism.</summary>
1515
<copyright>2012-2017, RENCI</copyright>
1616
<language>en-US</language>

src/Renci.SshNet.Tests.NET35/Renci.SshNet.Tests.NET35.csproj

Lines changed: 25 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -213,9 +213,15 @@
213213
<Compile Include="..\Renci.SshNet.Tests\Classes\CipherInfoTest.cs">
214214
<Link>Classes\CipherInfoTest.cs</Link>
215215
</Compile>
216+
<Compile Include="..\Renci.SshNet.Tests\Classes\ClientAuthenticationTest.cs">
217+
<Link>Classes\ClientAuthenticationTest.cs</Link>
218+
</Compile>
216219
<Compile Include="..\Renci.SshNet.Tests\Classes\ClientAuthenticationTestBase.cs">
217220
<Link>Classes\ClientAuthenticationTestBase.cs</Link>
218221
</Compile>
222+
<Compile Include="..\Renci.SshNet.Tests\Classes\ClientAuthenticationTest_Failure_MultiList_AllAllowedAuthenticationsHaveReachedPartialSuccessLimit.cs">
223+
<Link>Classes\ClientAuthenticationTest_Failure_MultiList_AllAllowedAuthenticationsHaveReachedPartialSuccessLimit.cs</Link>
224+
</Compile>
219225
<Compile Include="..\Renci.SshNet.Tests\Classes\ClientAuthenticationTest_Failure_SingleList_AuthenticationMethodFailed.cs">
220226
<Link>Classes\ClientAuthenticationTest_Failure_SingleList_AuthenticationMethodFailed.cs</Link>
221227
</Compile>
@@ -225,6 +231,21 @@
225231
<Compile Include="..\Renci.SshNet.Tests\Classes\ClientAuthenticationTest_Success_MultiList_DifferentAllowedAuthenticationsAfterPartialSuccess.cs">
226232
<Link>Classes\ClientAuthenticationTest_Success_MultiList_DifferentAllowedAuthenticationsAfterPartialSuccess.cs</Link>
227233
</Compile>
234+
<Compile Include="..\Renci.SshNet.Tests\Classes\ClientAuthenticationTest_Success_MultiList_PartialSuccessLimitReachedFollowedByFailureInAlternateBranch.cs">
235+
<Link>Classes\ClientAuthenticationTest_Success_MultiList_PartialSuccessLimitReachedFollowedByFailureInAlternateBranch.cs</Link>
236+
</Compile>
237+
<Compile Include="..\Renci.SshNet.Tests\Classes\ClientAuthenticationTest_Success_MultiList_PartialSuccessLimitReachedFollowedByFailureInAlternateBranch2.cs">
238+
<Link>Classes\ClientAuthenticationTest_Success_MultiList_PartialSuccessLimitReachedFollowedByFailureInAlternateBranch2.cs</Link>
239+
</Compile>
240+
<Compile Include="..\Renci.SshNet.Tests\Classes\ClientAuthenticationTest_Success_MultiList_PartialSuccessLimitReachedFollowedByFailureInSameBranch.cs">
241+
<Link>Classes\ClientAuthenticationTest_Success_MultiList_PartialSuccessLimitReachedFollowedByFailureInSameBranch.cs</Link>
242+
</Compile>
243+
<Compile Include="..\Renci.SshNet.Tests\Classes\ClientAuthenticationTest_Success_MultiList_PartialSuccessLimitReachedFollowedBySuccessInAlternateBranch.cs">
244+
<Link>Classes\ClientAuthenticationTest_Success_MultiList_PartialSuccessLimitReachedFollowedBySuccessInAlternateBranch.cs</Link>
245+
</Compile>
246+
<Compile Include="..\Renci.SshNet.Tests\Classes\ClientAuthenticationTest_Success_MultiList_PartialSuccessLimitReachedFollowedBySuccessInSameBranch.cs">
247+
<Link>Classes\ClientAuthenticationTest_Success_MultiList_PartialSuccessLimitReachedFollowedBySuccessInSameBranch.cs</Link>
248+
</Compile>
228249
<Compile Include="..\Renci.SshNet.Tests\Classes\ClientAuthenticationTest_Success_MultiList_SameAllowedAuthenticationsAfterPartialSuccess.cs">
229250
<Link>Classes\ClientAuthenticationTest_Success_MultiList_SameAllowedAuthenticationsAfterPartialSuccess.cs</Link>
230251
</Compile>
@@ -234,6 +255,9 @@
234255
<Compile Include="..\Renci.SshNet.Tests\Classes\ClientAuthenticationTest_Success_SingleList_SameAllowedAuthenticationAfterPartialSuccess.cs">
235256
<Link>Classes\ClientAuthenticationTest_Success_SingleList_SameAllowedAuthenticationAfterPartialSuccess.cs</Link>
236257
</Compile>
258+
<Compile Include="..\Renci.SshNet.Tests\Classes\ClientAuthenticationTest_Success_SingleList_SameAllowedAuthenticationAfterPartialSuccess_PartialSuccessLimitReached.cs">
259+
<Link>Classes\ClientAuthenticationTest_Success_SingleList_SameAllowedAuthenticationAfterPartialSuccess_PartialSuccessLimitReached.cs</Link>
260+
</Compile>
237261
<Compile Include="..\Renci.SshNet.Tests\Classes\CommandAsyncResultTest.cs">
238262
<Link>Classes\CommandAsyncResultTest.cs</Link>
239263
</Compile>
@@ -1668,7 +1692,7 @@
16681692
<Import Project="$(MSBuildBinPath)\Microsoft.CSharp.targets" />
16691693
<ProjectExtensions>
16701694
<VisualStudio>
1671-
<UserProperties ProjectLinkReference="c45379b9-17b1-4e89-bc2e-6d41726413e8" ProjectLinkerExcludeFilter="\\?desktop(\\.*)?$;\\?silverlight(\\.*)?$;\.desktop;\.silverlight;\.xaml;^service references(\\.*)?$;\.clientconfig;^web references(\\.*)?$" />
1695+
<UserProperties ProjectLinkerExcludeFilter="\\?desktop(\\.*)?$;\\?silverlight(\\.*)?$;\.desktop;\.silverlight;\.xaml;^service references(\\.*)?$;\.clientconfig;^web references(\\.*)?$" ProjectLinkReference="c45379b9-17b1-4e89-bc2e-6d41726413e8" />
16721696
</VisualStudio>
16731697
</ProjectExtensions>
16741698
<!-- To modify your build process, add your task inside one of the targets below and uncomment it.
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,136 @@
1+
using System;
2+
using System.Collections.Generic;
3+
using System.Threading;
4+
using Microsoft.VisualStudio.TestTools.UnitTesting;
5+
using Moq;
6+
using Renci.SshNet.Channels;
7+
using Renci.SshNet.Common;
8+
using Renci.SshNet.Messages.Connection;
9+
using Renci.SshNet.Tests.Common;
10+
11+
namespace Renci.SshNet.Tests.Classes.Channels
12+
{
13+
[TestClass]
14+
public class ChannelSessionTest_Dispose_SessionIsConnectedAndChannelIsOpen_ChannelCloseAndChannelEofReceived_DisposeInEventHandler
15+
{
16+
private Mock<ISession> _sessionMock;
17+
private uint _localChannelNumber;
18+
private uint _localWindowSize;
19+
private uint _localPacketSize;
20+
private uint _remoteChannelNumber;
21+
private uint _remoteWindowSize;
22+
private uint _remotePacketSize;
23+
private IList<ChannelEventArgs> _channelClosedRegister;
24+
private List<ExceptionEventArgs> _channelExceptionRegister;
25+
private ChannelSession _channel;
26+
private Mock<IConnectionInfo> _connectionInfoMock;
27+
private MockSequence _sequence;
28+
private SemaphoreLight _sessionSemaphore;
29+
private int _initialSessionSemaphoreCount;
30+
31+
[TestInitialize]
32+
public void Initialize()
33+
{
34+
Arrange();
35+
Act();
36+
}
37+
38+
private void Arrange()
39+
{
40+
var random = new Random();
41+
_localChannelNumber = (uint)random.Next(0, int.MaxValue);
42+
_localWindowSize = (uint)random.Next(0, int.MaxValue);
43+
_localPacketSize = (uint)random.Next(0, int.MaxValue);
44+
_remoteChannelNumber = (uint)random.Next(0, int.MaxValue);
45+
_remoteWindowSize = (uint)random.Next(0, int.MaxValue);
46+
_remotePacketSize = (uint)random.Next(0, int.MaxValue);
47+
_channelClosedRegister = new List<ChannelEventArgs>();
48+
_channelExceptionRegister = new List<ExceptionEventArgs>();
49+
_initialSessionSemaphoreCount = random.Next(10, 20);
50+
_sessionSemaphore = new SemaphoreLight(_initialSessionSemaphoreCount);
51+
52+
_sessionMock = new Mock<ISession>(MockBehavior.Strict);
53+
_connectionInfoMock = new Mock<IConnectionInfo>(MockBehavior.Strict);
54+
55+
_sequence = new MockSequence();
56+
_sessionMock.InSequence(_sequence).Setup(p => p.ConnectionInfo).Returns(_connectionInfoMock.Object);
57+
_connectionInfoMock.InSequence(_sequence).Setup(p => p.RetryAttempts).Returns(1);
58+
_sessionMock.Setup(p => p.SessionSemaphore).Returns(_sessionSemaphore);
59+
_sessionMock.InSequence(_sequence)
60+
.Setup(
61+
p =>
62+
p.SendMessage(
63+
It.Is<ChannelOpenMessage>(
64+
m =>
65+
m.LocalChannelNumber == _localChannelNumber &&
66+
m.InitialWindowSize == _localWindowSize && m.MaximumPacketSize == _localPacketSize &&
67+
m.Info is SessionChannelOpenInfo)));
68+
_sessionMock.InSequence(_sequence)
69+
.Setup(p => p.WaitOnHandle(It.IsNotNull<WaitHandle>()))
70+
.Callback<WaitHandle>(
71+
w =>
72+
{
73+
_sessionMock.Raise(
74+
s => s.ChannelOpenConfirmationReceived += null,
75+
new MessageEventArgs<ChannelOpenConfirmationMessage>(
76+
new ChannelOpenConfirmationMessage(
77+
_localChannelNumber,
78+
_remoteWindowSize,
79+
_remotePacketSize,
80+
_remoteChannelNumber)));
81+
w.WaitOne();
82+
});
83+
_sessionMock.InSequence(_sequence).Setup(p => p.IsConnected).Returns(true);
84+
_sessionMock.InSequence(_sequence)
85+
.Setup(p => p.TrySendMessage(It.Is<ChannelCloseMessage>(c => c.LocalChannelNumber == _remoteChannelNumber)))
86+
.Returns(true);
87+
_sessionMock.InSequence(_sequence)
88+
.Setup(s => s.WaitOnHandle(It.IsNotNull<EventWaitHandle>()))
89+
.Callback<WaitHandle>(w => w.WaitOne());
90+
91+
_channel = new ChannelSession(_sessionMock.Object, _localChannelNumber, _localWindowSize, _localPacketSize);
92+
_channel.Closed += (sender, args) =>
93+
{
94+
_channelClosedRegister.Add(args);
95+
_channel.Dispose();
96+
};
97+
_channel.Exception += (sender, args) => _channelExceptionRegister.Add(args);
98+
_channel.Open();
99+
100+
_sessionMock.Raise(p => p.ChannelEofReceived += null,
101+
new MessageEventArgs<ChannelEofMessage>(new ChannelEofMessage(_localChannelNumber)));
102+
_sessionMock.Raise(p => p.ChannelCloseReceived += null,
103+
new MessageEventArgs<ChannelCloseMessage>(new ChannelCloseMessage(_localChannelNumber)));
104+
}
105+
106+
private void Act()
107+
{
108+
_channel.Dispose();
109+
}
110+
111+
[TestMethod]
112+
public void CurrentCountOfSessionSemaphoreShouldBeEqualToInitialCount()
113+
{
114+
Assert.AreEqual(_initialSessionSemaphoreCount, _sessionSemaphore.CurrentCount);
115+
}
116+
117+
[TestMethod]
118+
public void ExceptionShouldNeverHaveFired()
119+
{
120+
Assert.AreEqual(0, _channelExceptionRegister.Count, _channelExceptionRegister.AsString());
121+
}
122+
123+
[TestMethod]
124+
public void ClosedEventShouldHaveFiredOnce()
125+
{
126+
Assert.AreEqual(1, _channelClosedRegister.Count);
127+
Assert.AreEqual(_localChannelNumber, _channelClosedRegister[0].ChannelNumber);
128+
}
129+
130+
[TestMethod]
131+
public void IsOpenShouldReturnFalse()
132+
{
133+
Assert.IsFalse(_channel.IsOpen);
134+
}
135+
}
136+
}

src/Renci.SshNet.Tests/Classes/ClientAuthenticationTest.cs

Lines changed: 58 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -12,13 +12,68 @@ public class ClientAuthenticationTest
1212
[TestInitialize]
1313
public void Init()
1414
{
15-
_clientAuthentication = new ClientAuthentication();
15+
_clientAuthentication = new ClientAuthentication(1);
1616
}
1717

18+
[TestMethod]
19+
public void Ctor_PartialSuccessLimit_Zero()
20+
{
21+
const int partialSuccessLimit = 0;
22+
23+
try
24+
{
25+
new ClientAuthentication(partialSuccessLimit);
26+
Assert.Fail();
27+
}
28+
catch (ArgumentOutOfRangeException ex)
29+
{
30+
Assert.IsNull(ex.InnerException);
31+
Assert.AreEqual(string.Format("Cannot be less than one.{0}Parameter name: {1}", Environment.NewLine, ex.ParamName), ex.Message);
32+
Assert.AreEqual("partialSuccessLimit", ex.ParamName);
33+
}
34+
}
35+
36+
[TestMethod]
37+
public void Ctor_PartialSuccessLimit_Negative()
38+
{
39+
var partialSuccessLimit = new Random().Next(int.MinValue, -1);
40+
41+
try
42+
{
43+
new ClientAuthentication(partialSuccessLimit);
44+
Assert.Fail();
45+
}
46+
catch (ArgumentOutOfRangeException ex)
47+
{
48+
Assert.IsNull(ex.InnerException);
49+
Assert.AreEqual(string.Format("Cannot be less than one.{0}Parameter name: {1}", Environment.NewLine, ex.ParamName), ex.Message);
50+
Assert.AreEqual("partialSuccessLimit", ex.ParamName);
51+
}
52+
}
53+
54+
[TestMethod]
55+
public void Ctor_PartialSuccessLimit_One()
56+
{
57+
const int partialSuccessLimit = 1;
58+
59+
var clientAuthentication = new ClientAuthentication(partialSuccessLimit);
60+
Assert.AreEqual(partialSuccessLimit, clientAuthentication.PartialSuccessLimit);
61+
}
62+
63+
[TestMethod]
64+
public void Ctor_PartialSuccessLimit_MaxValue()
65+
{
66+
const int partialSuccessLimit = int.MaxValue;
67+
68+
var clientAuthentication = new ClientAuthentication(partialSuccessLimit);
69+
Assert.AreEqual(partialSuccessLimit, clientAuthentication.PartialSuccessLimit);
70+
}
71+
72+
1873
[TestMethod]
1974
public void AuthenticateShouldThrowArgumentNullExceptionWhenConnectionInfoIsNull()
2075
{
21-
IConnectionInfoInternal connectionInfo = null;
76+
const IConnectionInfoInternal connectionInfo = null;
2277
var session = new Mock<ISession>(MockBehavior.Strict).Object;
2378

2479
try
@@ -37,7 +92,7 @@ public void AuthenticateShouldThrowArgumentNullExceptionWhenConnectionInfoIsNull
3792
public void AuthenticateShouldThrowArgumentNullExceptionWhenSessionIsNull()
3893
{
3994
var connectionInfo = new Mock<IConnectionInfoInternal>(MockBehavior.Strict).Object;
40-
ISession session = null;
95+
const ISession session = null;
4196

4297
try
4398
{

src/Renci.SshNet.Tests/Classes/ClientAuthenticationTestBase.cs

Lines changed: 11 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -13,7 +13,8 @@ public abstract class ClientAuthenticationTestBase : TestBase
1313
internal Mock<IAuthenticationMethod> PasswordAuthenticationMethodMock { get; private set; }
1414
internal Mock<IAuthenticationMethod> PublicKeyAuthenticationMethodMock { get; private set; }
1515
internal Mock<IAuthenticationMethod> KeyboardInteractiveAuthenticationMethodMock { get; private set; }
16-
internal ClientAuthentication ClientAuthentication { get; private set; }
16+
17+
protected abstract void SetupData();
1718

1819
protected void CreateMocks()
1920
{
@@ -27,18 +28,20 @@ protected void CreateMocks()
2728

2829
protected abstract void SetupMocks();
2930

31+
protected virtual void Arrange()
32+
{
33+
SetupData();
34+
CreateMocks();
35+
SetupMocks();
36+
}
37+
3038
protected abstract void Act();
3139

32-
protected override void OnInit()
40+
protected sealed override void OnInit()
3341
{
3442
base.OnInit();
3543

36-
// Arrange
37-
CreateMocks();
38-
SetupMocks();
39-
ClientAuthentication = new ClientAuthentication();
40-
41-
// Act
44+
Arrange();
4245
Act();
4346
}
4447

0 commit comments

Comments
 (0)