|
- using System;
- using System.Linq;
- using System.Threading;
- using System.Threading.Tasks;
- using Microsoft.VisualStudio.TestTools.UnitTesting;
- using MQTTnet.Exceptions;
-
- namespace MQTTnet.Core.Tests
- {
- [TestClass]
- public class ExtensionTests
- {
- [ExpectedException(typeof(MqttCommunicationTimedOutException))]
- [TestMethod]
- public async Task TimeoutAfter()
- {
- await MQTTnet.Internal.TaskExtensions.TimeoutAfter(ct => Task.Delay(TimeSpan.FromMilliseconds(500), ct), TimeSpan.FromMilliseconds(100), CancellationToken.None);
- }
-
- [ExpectedException(typeof(MqttCommunicationTimedOutException))]
- [TestMethod]
- public async Task TimeoutAfterWithResult()
- {
- await MQTTnet.Internal.TaskExtensions.TimeoutAfter(ct => Task.Delay(TimeSpan.FromMilliseconds(500), ct).ContinueWith(t => 5, ct), TimeSpan.FromMilliseconds(100), CancellationToken.None);
- }
-
- [TestMethod]
- public async Task TimeoutAfterCompleteInTime()
- {
- var result = await MQTTnet.Internal.TaskExtensions.TimeoutAfter(ct => Task.Delay(TimeSpan.FromMilliseconds(100), ct).ContinueWith(t => 5, ct), TimeSpan.FromMilliseconds(500), CancellationToken.None);
- Assert.AreEqual(5, result);
- }
-
- [TestMethod]
- public async Task TimeoutAfterWithInnerException()
- {
- try
- {
- await MQTTnet.Internal.TaskExtensions.TimeoutAfter(ct => Task.Run(() =>
- {
- var iis = new int[0];
- iis[1] = 0;
- }, ct), TimeSpan.FromSeconds(1), CancellationToken.None);
-
- Assert.Fail();
- }
- catch (Exception e)
- {
- Assert.IsTrue(e is IndexOutOfRangeException);
- }
- }
-
- [TestMethod]
- public async Task TimeoutAfterWithInnerExceptionWithResult()
- {
- try
- {
- await MQTTnet.Internal.TaskExtensions.TimeoutAfter(ct => Task.Run(() =>
- {
- var iis = new int[0];
- iis[1] = 0;
- return iis[0];
- }, ct), TimeSpan.FromSeconds(1), CancellationToken.None);
-
- Assert.Fail();
- }
- catch (Exception e)
- {
- Assert.IsTrue(e is IndexOutOfRangeException);
- }
- }
-
- [TestMethod]
- public async Task TimeoutAfterMemoryUsage()
- {
- var tasks = Enumerable.Range(0, 100000)
- .Select(i =>
- {
- return MQTTnet.Internal.TaskExtensions.TimeoutAfter(ct => Task.Delay(TimeSpan.FromMilliseconds(1), ct), TimeSpan.FromMinutes(1), CancellationToken.None);
- });
-
- await Task.WhenAll(tasks);
- AssertIsLess(3_000_000, GC.GetTotalMemory(true));
- }
-
- private static void AssertIsLess(long bound, long actual)
- {
- if (bound < actual)
- {
- Assert.Fail($"value must be less than {bound:N0} but is {actual:N0}");
- }
- }
- }
- }
|