Files
Nikola Milekic c5c6f28d60 Avoid rounding issues when checking Timeout values (#1700) (#1712)
* Avoid rounding issues when checking Timeout values (#1700)

AsTimeout is called from the SshCommand constructor with
Timeout.InfiniteTimeSpan. In this scenario the range check should never
fail, but unfortunately it does in certain scenarios, due to a runtime
or compiler bug (as soon as optimizations are turned off the issue
miraculously disappears).

Closes #1700

* fix tests

---------

Co-authored-by: Robert Hague <rh@johnstreetcapital.com>
2025-10-08 10:43:13 +02:00

102 lines
3.3 KiB
C#

using System;
using Microsoft.VisualStudio.TestTools.UnitTesting;
using Renci.SshNet.Tests.Common;
namespace Renci.SshNet.Tests.Classes
{
/// <summary>
/// Implementation of the SSH File Transfer Protocol (SFTP) over SSH.
/// </summary>
[TestClass]
public partial class SftpClientTest : TestBase
{
private Random _random;
[TestInitialize]
public void SetUp()
{
_random = new Random();
}
[TestMethod]
public void OperationTimeout_Default()
{
var connectionInfo = new PasswordConnectionInfo("host", 22, "admin", "pwd");
var target = new SftpClient(connectionInfo);
var actual = target.OperationTimeout;
Assert.AreEqual(TimeSpan.FromMilliseconds(-1), actual);
}
[TestMethod]
public void OperationTimeout_InsideLimits()
{
var operationTimeout = TimeSpan.FromMilliseconds(_random.Next(0, int.MaxValue - 1));
var connectionInfo = new PasswordConnectionInfo("host", 22, "admin", "pwd");
var target = new SftpClient(connectionInfo)
{
OperationTimeout = operationTimeout
};
var actual = target.OperationTimeout;
Assert.AreEqual(operationTimeout, actual);
}
[TestMethod]
public void OperationTimeout_LowerLimit()
{
var operationTimeout = TimeSpan.FromMilliseconds(-1);
var connectionInfo = new PasswordConnectionInfo("host", 22, "admin", "pwd");
var target = new SftpClient(connectionInfo)
{
OperationTimeout = operationTimeout
};
var actual = target.OperationTimeout;
Assert.AreEqual(operationTimeout, actual);
}
[TestMethod]
public void OperationTimeout_UpperLimit()
{
var operationTimeout = TimeSpan.FromMilliseconds(int.MaxValue);
var connectionInfo = new PasswordConnectionInfo("host", 22, "admin", "pwd");
var target = new SftpClient(connectionInfo)
{
OperationTimeout = operationTimeout
};
var actual = target.OperationTimeout;
Assert.AreEqual(operationTimeout, actual);
}
[TestMethod]
public void OperationTimeout_LessThanLowerLimit()
{
var operationTimeout = TimeSpan.FromMilliseconds(-2);
var connectionInfo = new PasswordConnectionInfo("host", 22, "admin", "pwd");
var target = new SftpClient(connectionInfo);
var ex = Assert.Throws<ArgumentOutOfRangeException>(() => target.OperationTimeout = operationTimeout);
Assert.AreEqual("OperationTimeout", ex.ParamName);
}
[TestMethod]
public void OperationTimeout_GreaterThanLowerLimit()
{
var operationTimeout = TimeSpan.FromMilliseconds(int.MaxValue).Add(TimeSpan.FromMilliseconds(1));
var connectionInfo = new PasswordConnectionInfo("host", 22, "admin", "pwd");
var target = new SftpClient(connectionInfo);
var ex = Assert.Throws<ArgumentOutOfRangeException>(() => target.OperationTimeout = operationTimeout);
Assert.AreEqual("OperationTimeout", ex.ParamName);
}
}
}