rd-net/Test.RdFramework/AsyncRdTaskTest.cs (116 lines of code) (raw):

using System; using System.Diagnostics; using System.Threading.Tasks; using JetBrains.Collections.Viewable; using JetBrains.Core; using JetBrains.Rd.Base; using JetBrains.Rd.Impl; using JetBrains.Rd.Tasks; using JetBrains.Threading; using JetBrains.Util; using NUnit.Framework; namespace Test.RdFramework; [TestFixture] public class AsyncRdTaskTest : RdFrameworkTestBase { protected override IScheduler CreateScheduler(bool isServer) { return SingleThreadScheduler.RunOnSeparateThread(LifetimeDefinition.Lifetime, $"{(isServer ? "Server" : "Client")} Scheduler"); } [Test] public void BindableRdCallListUseSystemTaskTest() { BindableRdCallListTest(TaskKind.System); } [Test] public void BindableRdCallListUseRdTaskTest() { BindableRdCallListTest(TaskKind.Rd); } public enum TaskKind { System, Rd, } private void BindableRdCallListTest(TaskKind taskKind) { ClientWire.AutoTransmitMode = true; ServerWire.AutoTransmitMode = true; var lifetime = LifetimeDefinition.Lifetime; { var entity_id = 1; var callsite = new RdCall<Unit, RdList<int>>(Serializers.ReadVoid, Serializers.WriteVoid, RdList<int>.Read, RdList<int>.Write); var endpoint = new RdCall<Unit, RdList<int>>(Serializers.ReadVoid, Serializers.WriteVoid, RdList<int>.Read, RdList<int>.Write); var n = 1; var bindServerTask = lifetime.Start(ServerProtocol.Scheduler.AsTaskScheduler(), () => { BindToServer(lifetime, endpoint, entity_id); endpoint.SetSync(_ => { var list = new RdList<int>(Polymorphic<int>.Read, Polymorphic<int>.Write); for (var i = 0; i < n; i++) list.Add(i); return list; }); }); Assert.IsTrue(bindServerTask.Wait(Timeout(TimeSpan.FromSeconds(10)))); var bindClientTask = lifetime.StartAsync(ClientProtocol.Scheduler.AsTaskScheduler(), async () => { BindToClient(lifetime, callsite, entity_id); var list = taskKind switch { TaskKind.System => await callsite.Start(lifetime, Unit.Instance).AsTask(), TaskKind.Rd => await callsite.Start(lifetime, Unit.Instance), _ => throw new ArgumentOutOfRangeException(nameof(taskKind), taskKind, null) }; var count = 0; list.View(lifetime, (lt, index, value) => { Assert.AreEqual(count++, value); Assert.AreEqual(index, value); }); var stopwatch = LocalStopwatch.StartNew(); while (count != n) { if (stopwatch.Elapsed > Timeout(TimeSpan.FromSeconds(10))) throw new TimeoutException(); await Task.Yield(); } }); Assert.IsTrue(bindClientTask.Wait(Timeout(TimeSpan.FromSeconds(10)))); } } [Test] [TestCase(TaskKind.Rd)] [TestCase(TaskKind.System)] public void TestRdTaskAwaiter(TaskKind kind) { var rdTask = new RdTask<Unit>(); var scheduler = new TaskSchedulerWrapper(new ConcurrentExclusiveSchedulerPair(TaskScheduler.Default).ExclusiveScheduler, false); var task = TestLifetime.StartAsync(scheduler.AsTaskScheduler(), async () => { scheduler.AssertThread(); TestLifetime.Start(scheduler.AsTaskScheduler(), () => { scheduler.AssertThread(); TestLifetime.Start(TaskScheduler.Default, () => { rdTask.ResultInternal.Set(RdTaskResult<Unit>.Success(Unit.Instance)); }).NoAwait(); }).NoAwait(); _ = kind switch { TaskKind.System => await rdTask.AsTask(), TaskKind.Rd => await rdTask, _ => throw new ArgumentOutOfRangeException(nameof(kind), kind, null) }; scheduler.AssertThread(); }); task.Wait(TimeSpan.FromSeconds(10)); Assert.IsTrue(task.IsCompleted); } private static TimeSpan Timeout(TimeSpan timeout) { return Debugger.IsAttached ? TimeSpan.FromDays(1) : timeout; } }