|
|
@@ -26,6 +26,7 @@ namespace Renci.SshNet.Tests.Classes.Common
|
|
|
var countdownEvent = CreateCountdownEvent(initialCount);
|
|
|
Assert.AreEqual(initialCount, countdownEvent.CurrentCount);
|
|
|
Assert.IsFalse(countdownEvent.IsSet);
|
|
|
+ Assert.IsFalse(countdownEvent.WaitHandle.WaitOne(0));
|
|
|
countdownEvent.Dispose();
|
|
|
}
|
|
|
|
|
|
@@ -37,6 +38,7 @@ namespace Renci.SshNet.Tests.Classes.Common
|
|
|
var countdownEvent = CreateCountdownEvent(0);
|
|
|
Assert.AreEqual(initialCount, countdownEvent.CurrentCount);
|
|
|
Assert.IsTrue(countdownEvent.IsSet);
|
|
|
+ Assert.IsTrue(countdownEvent.WaitHandle.WaitOne(0));
|
|
|
countdownEvent.Dispose();
|
|
|
}
|
|
|
|
|
|
@@ -49,6 +51,7 @@ namespace Renci.SshNet.Tests.Classes.Common
|
|
|
Assert.IsFalse(countdownEvent.Signal());
|
|
|
Assert.AreEqual(--initialCount, countdownEvent.CurrentCount);
|
|
|
Assert.IsFalse(countdownEvent.IsSet);
|
|
|
+ Assert.IsFalse(countdownEvent.WaitHandle.WaitOne(0));
|
|
|
countdownEvent.Dispose();
|
|
|
}
|
|
|
|
|
|
@@ -59,6 +62,7 @@ namespace Renci.SshNet.Tests.Classes.Common
|
|
|
Assert.IsTrue(countdownEvent.Signal());
|
|
|
Assert.AreEqual(0, countdownEvent.CurrentCount);
|
|
|
Assert.IsTrue(countdownEvent.IsSet);
|
|
|
+ Assert.IsTrue(countdownEvent.WaitHandle.WaitOne(0));
|
|
|
countdownEvent.Dispose();
|
|
|
}
|
|
|
|
|
|
@@ -82,10 +86,6 @@ namespace Renci.SshNet.Tests.Classes.Common
|
|
|
}
|
|
|
}
|
|
|
|
|
|
- public void CurrentCountShouldReturnZeroAfterAttemptToDecrementCountBelowZero()
|
|
|
- {
|
|
|
- }
|
|
|
-
|
|
|
[TestMethod]
|
|
|
public void Wait_TimeoutInfinite_ShouldBlockUntilCountdownEventIsSet()
|
|
|
{
|
|
|
@@ -118,6 +118,7 @@ namespace Renci.SshNet.Tests.Classes.Common
|
|
|
Assert.IsTrue(actual);
|
|
|
Assert.AreEqual(expectedSignalCount, signalCount);
|
|
|
Assert.IsTrue(countdownEvent.IsSet);
|
|
|
+ Assert.IsTrue(countdownEvent.WaitHandle.WaitOne(0));
|
|
|
Assert.IsTrue(elapsedTime >= sleep);
|
|
|
Assert.IsTrue(elapsedTime <= sleep.Add(TimeSpan.FromMilliseconds(100)));
|
|
|
|
|
|
@@ -156,6 +157,7 @@ namespace Renci.SshNet.Tests.Classes.Common
|
|
|
Assert.IsTrue(actual);
|
|
|
Assert.AreEqual(expectedSignalCount, signalCount);
|
|
|
Assert.IsTrue(countdownEvent.IsSet);
|
|
|
+ Assert.IsTrue(countdownEvent.WaitHandle.WaitOne(0));
|
|
|
Assert.IsTrue(elapsedTime >= sleep);
|
|
|
Assert.IsTrue(elapsedTime <= timeout);
|
|
|
|
|
|
@@ -163,7 +165,7 @@ namespace Renci.SshNet.Tests.Classes.Common
|
|
|
}
|
|
|
|
|
|
[TestMethod]
|
|
|
- public void Wait_ShouldReturnFalseTimeoutExpiresBeforeCountdownEventIsSet()
|
|
|
+ public void Wait_ShouldReturnFalseWhenTimeoutExpiresBeforeCountdownEventIsSet()
|
|
|
{
|
|
|
var sleep = TimeSpan.FromMilliseconds(100);
|
|
|
var timeout = TimeSpan.FromMilliseconds(30);
|
|
|
@@ -193,6 +195,135 @@ namespace Renci.SshNet.Tests.Classes.Common
|
|
|
|
|
|
Assert.IsFalse(actual);
|
|
|
Assert.IsFalse(countdownEvent.IsSet);
|
|
|
+ Assert.IsFalse(countdownEvent.WaitHandle.WaitOne(0));
|
|
|
+ Assert.IsTrue(elapsedTime >= timeout);
|
|
|
+
|
|
|
+ countdownEvent.Wait(Session.InfiniteTimeSpan);
|
|
|
+ countdownEvent.Dispose();
|
|
|
+ }
|
|
|
+
|
|
|
+ [TestMethod]
|
|
|
+ public void WaitHandle_ShouldAlwaysReturnSameInstance()
|
|
|
+ {
|
|
|
+ var countdownEvent = CreateCountdownEvent(1);
|
|
|
+
|
|
|
+ var waitHandleA = countdownEvent.WaitHandle;
|
|
|
+ Assert.IsNotNull(waitHandleA);
|
|
|
+
|
|
|
+ var waitHandleB = countdownEvent.WaitHandle;
|
|
|
+ Assert.AreSame(waitHandleA, waitHandleB);
|
|
|
+ }
|
|
|
+
|
|
|
+ [TestMethod]
|
|
|
+ public void WaitHandle_WaitOne_TimeoutInfinite_ShouldBlockUntilCountdownEventIsSet()
|
|
|
+ {
|
|
|
+ var sleep = TimeSpan.FromMilliseconds(100);
|
|
|
+ var timeout = Session.InfiniteTimeSpan;
|
|
|
+
|
|
|
+ var countdownEvent = CreateCountdownEvent(1);
|
|
|
+ var signalCount = 0;
|
|
|
+ var expectedSignalCount = _random.Next(5, 20);
|
|
|
+
|
|
|
+ for (var i = 0; i < (expectedSignalCount - 1); i++)
|
|
|
+ countdownEvent.AddCount();
|
|
|
+
|
|
|
+ var threads = new Thread[expectedSignalCount];
|
|
|
+ for (var i = 0; i < expectedSignalCount; i++)
|
|
|
+ {
|
|
|
+ threads[i] = new Thread(() =>
|
|
|
+ {
|
|
|
+ Thread.Sleep(sleep);
|
|
|
+ Interlocked.Increment(ref signalCount);
|
|
|
+ countdownEvent.Signal();
|
|
|
+ });
|
|
|
+ threads[i].Start();
|
|
|
+ }
|
|
|
+
|
|
|
+ var start = DateTime.Now;
|
|
|
+ var actual = countdownEvent.WaitHandle.WaitOne(timeout);
|
|
|
+ var elapsedTime = DateTime.Now - start;
|
|
|
+
|
|
|
+ Assert.IsTrue(actual);
|
|
|
+ Assert.AreEqual(expectedSignalCount, signalCount);
|
|
|
+ Assert.IsTrue(countdownEvent.IsSet);
|
|
|
+ Assert.IsTrue(countdownEvent.WaitHandle.WaitOne(0));
|
|
|
+ Assert.IsTrue(elapsedTime >= sleep);
|
|
|
+ Assert.IsTrue(elapsedTime <= sleep.Add(TimeSpan.FromMilliseconds(100)));
|
|
|
+
|
|
|
+ countdownEvent.Dispose();
|
|
|
+ }
|
|
|
+
|
|
|
+ [TestMethod]
|
|
|
+ public void WaitHandle_WaitOne_ShouldReturnTrueWhenCountdownEventIsSetBeforeTimeoutExpires()
|
|
|
+ {
|
|
|
+ var sleep = TimeSpan.FromMilliseconds(100);
|
|
|
+ var timeout = sleep.Add(TimeSpan.FromSeconds(2));
|
|
|
+
|
|
|
+ var countdownEvent = CreateCountdownEvent(1);
|
|
|
+ var signalCount = 0;
|
|
|
+ var expectedSignalCount = _random.Next(5, 20);
|
|
|
+
|
|
|
+ for (var i = 0; i < (expectedSignalCount - 1); i++)
|
|
|
+ countdownEvent.AddCount();
|
|
|
+
|
|
|
+ var threads = new Thread[expectedSignalCount];
|
|
|
+ for (var i = 0; i < expectedSignalCount; i++)
|
|
|
+ {
|
|
|
+ threads[i] = new Thread(() =>
|
|
|
+ {
|
|
|
+ Thread.Sleep(sleep);
|
|
|
+ Interlocked.Increment(ref signalCount);
|
|
|
+ countdownEvent.Signal();
|
|
|
+ });
|
|
|
+ threads[i].Start();
|
|
|
+ }
|
|
|
+
|
|
|
+ var start = DateTime.Now;
|
|
|
+ var actual = countdownEvent.Wait(timeout);
|
|
|
+ var elapsedTime = DateTime.Now - start;
|
|
|
+
|
|
|
+ Assert.IsTrue(actual);
|
|
|
+ Assert.AreEqual(expectedSignalCount, signalCount);
|
|
|
+ Assert.IsTrue(countdownEvent.IsSet);
|
|
|
+ Assert.IsTrue(countdownEvent.WaitHandle.WaitOne(0));
|
|
|
+ Assert.IsTrue(elapsedTime >= sleep);
|
|
|
+ Assert.IsTrue(elapsedTime <= timeout);
|
|
|
+
|
|
|
+ countdownEvent.Dispose();
|
|
|
+ }
|
|
|
+
|
|
|
+ [TestMethod]
|
|
|
+ public void WaitHandle_WaitOne_ShouldReturnFalseWhenTimeoutExpiresBeforeCountdownEventIsSet()
|
|
|
+ {
|
|
|
+ var sleep = TimeSpan.FromMilliseconds(100);
|
|
|
+ var timeout = TimeSpan.FromMilliseconds(30);
|
|
|
+
|
|
|
+ var countdownEvent = CreateCountdownEvent(1);
|
|
|
+ var signalCount = 0;
|
|
|
+ var expectedSignalCount = _random.Next(5, 20);
|
|
|
+
|
|
|
+ for (var i = 0; i < (expectedSignalCount - 1); i++)
|
|
|
+ countdownEvent.AddCount();
|
|
|
+
|
|
|
+ var threads = new Thread[expectedSignalCount];
|
|
|
+ for (var i = 0; i < expectedSignalCount; i++)
|
|
|
+ {
|
|
|
+ threads[i] = new Thread(() =>
|
|
|
+ {
|
|
|
+ Thread.Sleep(sleep);
|
|
|
+ countdownEvent.Signal();
|
|
|
+ Interlocked.Increment(ref signalCount);
|
|
|
+ });
|
|
|
+ threads[i].Start();
|
|
|
+ }
|
|
|
+
|
|
|
+ var start = DateTime.Now;
|
|
|
+ var actual = countdownEvent.WaitHandle.WaitOne(timeout);
|
|
|
+ var elapsedTime = DateTime.Now - start;
|
|
|
+
|
|
|
+ Assert.IsFalse(actual);
|
|
|
+ Assert.IsFalse(countdownEvent.IsSet);
|
|
|
+ Assert.IsFalse(countdownEvent.WaitHandle.WaitOne(0));
|
|
|
Assert.IsTrue(elapsedTime >= timeout);
|
|
|
|
|
|
countdownEvent.Wait(Session.InfiniteTimeSpan);
|