Пример #1
0
            public async Task ConcurrentRequests()
            {
                var responds = new ConcurrentQueue <int>();
                var input    = new ConcurrentQueue <string>();
                var output   = new ConcurrentQueue <string>();

                void OutputHandler(object o, ROutputEventArgs e) => output.Enqueue(e.Message);

                Task <string> InputHandler(string prompt, int maximumLength, CancellationToken ct)
                {
                    input.Enqueue(prompt);
                    return(Task.FromResult($"{prompt}\n"));
                }

                _callback.ReadUserInputHandler = InputHandler;
                _session.Output += OutputHandler;
                await ParallelTools.InvokeAsync(10, async i => {
                    using (var interaction = await _session.BeginInteractionAsync()) {
                        responds.Enqueue(i);
                        await interaction.RespondAsync($"readline('{i}')");
                    }
                }, 20000);

                _session.Output -= OutputHandler;

                responds.Should().BeEquivalentTo(Enumerable.Range(0, 10));
                input.Should().Equal(responds.Select(i => i.ToString()));
                output.Should().Contain(responds.Select(i => $" \"{i}\""));
            }
Пример #2
0
        private async Task RunAsync(IXunitTestCase testCase, Func <Task> action, RunSummary runSummary, string timeoutMessage)
        {
            Exception exception = null;

            _stopwatch.Restart();
            try {
                var task = action();
                await ParallelTools.When(task, 60_000, timeoutMessage);

                await task;
            } catch (Exception ex) {
                exception = ex;
            }
            _stopwatch.Stop();

            var time           = (decimal)_stopwatch.Elapsed.TotalSeconds;
            var taskRunSummary = exception != null
                ? RegisterFailedRunSummary(testCase, time, exception)
                : new RunSummary
            {
                Time = time
            };

            runSummary.Aggregate(taskRunSummary);
        }
Пример #3
0
        public async Task StartStopMultipleSessions()
        {
            Func <int, Task <RSession> > start = async i => {
                var session = new RSession(i, _brokerClient, () => { });
                await session.StartHostAsync(new RHostStartupInfo { Name = _testMethod.Name + i }, null, 50000);

                return(session);
            };

            var sessionsTasks = await ParallelTools.InvokeAsync(4, start);

            if (sessionsTasks.Any(t => t.Status != TaskStatus.RanToCompletion))
            {
                Debugger.Launch();
            }

            sessionsTasks.Should().OnlyContain(t => t.Status == TaskStatus.RanToCompletion);
            var sessions = sessionsTasks.Select(t => t.Result).ToList();

            sessions.Should().OnlyContain(t => t.IsHostRunning);

            var sessionStopTasks = await ParallelTools.InvokeAsync(4, i => sessionsTasks[i].Result.StopHostAsync());

            sessionStopTasks.Should().OnlyContain(t => t.Status == TaskStatus.RanToCompletion);
            sessions.Should().OnlyContain(t => !t.IsHostRunning);
        }
Пример #4
0
        public async Task Concurrent_Write_ReadCanceled()
        {
            var writersCount = 0;

            await ParallelTools.InvokeAsync(48, async i => {
                // Every 4th lock is writer lock
                var isWriter = i % 4 == 0;
                if (isWriter)
                {
                    var task = _arwl.WriterLockAsync(CancellationToken.None);
                    using (await task) {
                        var count = writersCount;
                        await Task.Delay(20, CancellationToken.None);
                        // CompareExchange won't work if lock wasn't exclusive
                        Interlocked.CompareExchange(ref writersCount, count + 1, count);
                    }
                    return(task);
                }
                else
                {
                    var cts  = new CancellationTokenSource();
                    var task = _arwl.ReaderLockAsync(cts.Token);
                    cts.Cancel();
                    if (!task.IsCanceled)
                    {
                        (await task).Dispose();
                    }
                    return(task);
                }
            });

            writersCount.Should().Be(12);
        }
        public async Task CanceledOnTimeout()
        {
            var tcs = new TaskCompletionSource <int>();

            tcs.RegisterForCancellation(200, CancellationToken.None);
            await ParallelTools.When(tcs.Task);

            tcs.Task.Should().BeCanceled();
        }
Пример #6
0
 public void ParallelAccess()
 {
     using (var sessionProvider = new RSessionProvider(TestCoreServices.CreateReal())) {
         var guids = new[] { new Guid(), new Guid() };
         ParallelTools.Invoke(100, i => {
             var session = sessionProvider.GetOrCreate(guids[i % 2]);
             session.Dispose();
         });
     }
 }
Пример #7
0
 public void ParallelAccess()
 {
     using (var sessionProvider = new RSessionProvider()) {
         var guids = new[] { new Guid(), new Guid() };
         ParallelTools.Invoke(100, i => {
             var session = sessionProvider.GetOrCreate(guids[i % 2], _brokerConnector);
             session.Dispose();
         });
     }
 }
Пример #8
0
 public void ParallelAccess()
 {
     using (var sessionProvider = new RSessionProvider(_services)) {
         var guids = new[] { nameof(ParallelAccess) + 1, nameof(ParallelAccess) + 2 };
         ParallelTools.Invoke(100, i => {
             var session = sessionProvider.GetOrCreate(guids[i % 2]);
             session.Dispose();
         });
     }
 }
        public async Task CanceledOnToken()
        {
            var tcs = new TaskCompletionSource <int>();
            var cts = new CancellationTokenSource();

            tcs.RegisterForCancellation(cts.Token);
            cts.CancelAfter(200);
            await ParallelTools.When(tcs.Task);

            tcs.Task.Should().BeCanceled();
        }
Пример #10
0
        public async Task SwitchToTheSameBroker_NoSessions()
        {
            using (var sessionProvider = new RSessionProvider(_services)) {
                var switch1Task = sessionProvider.TrySwitchBrokerAsync(nameof(RSessionProviderTest) + nameof(SwitchToTheSameBroker_NoSessions));
                var switch2Task = sessionProvider.TrySwitchBrokerAsync(nameof(RSessionProviderTest) + nameof(SwitchToTheSameBroker_NoSessions));
                await ParallelTools.WhenAll(30000, switch1Task, switch2Task);

                switch1Task.Status.Should().Be(TaskStatus.RanToCompletion);
                switch2Task.Status.Should().Be(TaskStatus.RanToCompletion);
            }
        }
Пример #11
0
        private async Task InitializeGraphicsDevice()
        {
            var deviceCreatedTask = EventTaskSources.IRPlotManager.DeviceAdded.Create(_plotManager);
            var deviceChangedTask = EventTaskSources.IRPlotManager.ActiveDeviceChanged.Create(_plotManager);

            var eval   = _workflow.ActiveWindow.InteractiveWindow.Evaluator;
            var result = await eval.ExecuteCodeAsync("dev.new()\n");

            result.IsSuccessful.Should().BeTrue();

            await ParallelTools.WhenAll(20000, deviceCreatedTask, deviceChangedTask);
        }
Пример #12
0
 public void RHostPipeFuzzTest(int iteration)
 {
     ParallelTools.Invoke(1000, i => {
         var input = GenerateInput();
         try {
             var message  = Message.Parse(input);
             var msgbytes = message.ToBytes();
         } catch (InvalidDataException) {
         } catch (TraceFailException) {
         }
     });
 }
Пример #13
0
        public async Task Invoke_Concurrent_ChangeAction()
        {
            var counts = new int[4];
            var action = new DelayedAsyncAction(200);

            ParallelTools.Invoke(4, i => {
                action.Invoke(() => Task.FromResult(Interlocked.Increment(ref counts[i])));
            });
            await Task.Delay(400);

            counts.Should().ContainSingle(i => i == 1, "DelayedAction should be called only once")
            .And.OnlyContain(i => i <= 1, "DelayedAction should be called more than once");
        }
Пример #14
0
        public async Task SwitchAvailableLoadedInstalledAsync()
        {
            var t1 = InUI(() => _packageManagerViewModel.SwitchToAvailablePackagesAsync());
            var t2 = InUI(() => _packageManagerViewModel.SwitchToLoadedPackagesAsync());
            var t3 = InUI(() => _packageManagerViewModel.SwitchToInstalledPackagesAsync());

            await ParallelTools.WhenAll(t1, t2, t3);

            _packageManagerViewModel.IsLoading.Should().BeFalse();
            _packageManagerViewModel.SelectedPackage.Should().NotBeNull();
            _packageManagerViewModel.Items.Should().OnlyContain(o => ((IRPackageViewModel)o).IsInstalled)
            .And.Contain(_packageManagerViewModel.SelectedPackage);
        }
Пример #15
0
        public async Task InvokeTwice_DuringTimeout_Concurrent()
        {
            var count  = 0;
            var action = new DelayedAsyncAction(200, () => Task.FromResult(Interlocked.Increment(ref count)));

            ParallelTools.Invoke(4, async i => {
                await Task.Delay(50 * i);
                action.Invoke();
            });
            await Task.Delay(500);

            count.Should().Be(1, "DelayedAction should be called only once");
        }
Пример #16
0
            public async Task CancelAllInParallel()
            {
                Task responceTask;

                using (var interaction = await _session.BeginInteractionAsync()) {
                    responceTask = interaction.RespondAsync("while(TRUE){}\n");
                }

                await ParallelTools.InvokeAsync(4, i => _session.CancelAllAsync());

                _session.IsHostRunning.Should().BeTrue();
                responceTask.Status.Should().Be(TaskStatus.Canceled);
            }
Пример #17
0
        public async Task Concurrent_Write()
        {
            var writersCount = 0;
            await ParallelTools.InvokeAsync(12, async i => {
                using (await _arwl.WriterLockAsync()) {
                    var count = writersCount;
                    await Task.Delay(20);
                    // CompareExchange won't work it lock wasn't exclusive
                    Interlocked.CompareExchange(ref writersCount, count + 1, count);
                }
            });

            writersCount.Should().Be(12);
        }
Пример #18
0
        public void TrySetException()
        {
            var tcs   = new TaskCompletionSourceEx <int>();
            var count = 0;

            ParallelTools.Invoke(8, i => {
                var isSet = tcs.TrySetException(new Exception());
                if (isSet)
                {
                    Interlocked.Increment(ref count);
                }
            });

            count.Should().Be(1);
        }
Пример #19
0
        public async Task Release()
        {
            var bal   = new BinaryAsyncLock();
            var count = 0;
            await ParallelTools.InvokeAsync(4, async i => {
                var isSet = await bal.WaitAsync();
                if (!isSet)
                {
                    Interlocked.Increment(ref count);
                    bal.Release();
                }
            });

            count.Should().Be(1);
        }
Пример #20
0
        public async Task WaitAsync_SetInCtor()
        {
            var bal   = new BinaryAsyncLock(true);
            var count = 0;
            await ParallelTools.InvokeAsync(4, async i => {
                await bal.WaitAsync();
                if (!bal.IsSet)
                {
                    await Task.Delay(50);
                    Interlocked.Increment(ref count);
                }
            });

            count.Should().Be(0);
        }
Пример #21
0
        public async Task SwitchLoadedInstalledAvailableAsync()
        {
            var t1 = InUI(() => _packageManagerViewModel.SwitchToLoadedPackagesAsync());
            var t2 = InUI(() => _packageManagerViewModel.SwitchToInstalledPackagesAsync());
            var t3 = InUI(() => _packageManagerViewModel.SwitchToAvailablePackagesAsync());

            await ParallelTools.WhenAll(t1, t2, t3);

            var expected = new [] { "NotAvailable1", "NotAvailable2", "rtvslib1" };

            _packageManagerViewModel.IsLoading.Should().BeFalse();
            _packageManagerViewModel.SelectedPackage.Should().NotBeNull();
            _packageManagerViewModel.Items.Should().Equal(expected, (o, n) => ((IRPackageViewModel)o).Name.EqualsOrdinal(n))
            .And.Contain(_packageManagerViewModel.SelectedPackage);
        }
Пример #22
0
            public async Task ExclusiveInteraction()
            {
                var interactionTasks = ParallelTools.Invoke(4, i => _session.BeginInteractionAsync());
                IList <Task <IRSessionInteraction> > runningTasks = interactionTasks.ToList();

                while (runningTasks.Count > 0)
                {
                    await Task.WhenAny(runningTasks);

                    IList <Task <IRSessionInteraction> > completedTasks;
                    runningTasks.Split(t => t.Status == TaskStatus.RanToCompletion, out completedTasks, out runningTasks);
                    completedTasks.Should().ContainSingle();
                    completedTasks.Single().Result.Dispose();
                }
            }
Пример #23
0
        public async Task WaitAsync_Reset()
        {
            var bal   = new BinaryAsyncLock();
            var count = 0;
            await ParallelTools.InvokeAsync(4, async i => {
                var token = await bal.WaitAsync();
                if (!bal.IsSet)
                {
                    await Task.Delay(50);
                    Interlocked.Increment(ref count);
                    token.Reset();
                }
            });

            count.Should().Be(4);
        }
Пример #24
0
        public async Task DoubleStart()
        {
            var         session = new RSession(0, _testMethod.FileSystemSafeName, _brokerClient, new AsyncReaderWriterLock().CreateExclusiveReaderLock(), () => { });
            Func <Task> start   = () => session.StartHostAsync(new RHostStartupInfo(), null, 50000);

            var tasks = await ParallelTools.InvokeAsync(4, i => start(), 50000);

            tasks.Should().ContainSingle(t => t.Status == TaskStatus.RanToCompletion);

            await session.HostStarted;

            session.IsHostRunning.Should().BeTrue();

            await session.StopHostAsync();

            session.IsHostRunning.Should().BeFalse();
        }
Пример #25
0
        public async Task StartStopMultipleSessions()
        {
            Func <int, Task <RSession> > start = async i => {
                var session = new RSession(i, () => { });
                await session.StartHostAsync(new RHostStartupInfo { Name = _testMethod.Name, RBasePath = RUtilities.FindExistingRBasePath() }, null, 50000);

                return(session);
            };

            var sessions = await ParallelTools.InvokeAsync(4, start);

            sessions.Should().OnlyContain(s => s.IsHostRunning);

            await ParallelTools.InvokeAsync(4, i => sessions[i].StopHostAsync());

            sessions.Should().OnlyContain(s => !s.IsHostRunning);
        }
Пример #26
0
            public async Task ConcurrentRequests()
            {
                var output = new List <string>();
                EventHandler <ROutputEventArgs> outputHandler = (o, e) => output.Add(e.Message);

                _callback.ReadUserInputHandler = (m, l, c) => Task.FromResult($"{m}\n");

                await ParallelTools.InvokeAsync(10, async i => {
                    using (var interaction = await _session.BeginInteractionAsync()) {
                        _session.Output += outputHandler;
                        await interaction.RespondAsync($"readline('{i}')");
                        _session.Output -= outputHandler;
                    }
                });

                output.Should().Contain(Enumerable.Range(0, 10).Select(i => $" \"{i}\""));
            }
Пример #27
0
        public async Task ConnectWhenSwitching()
        {
            using (var sessionProvider = new RSessionProvider(_services)) {
                var session1   = sessionProvider.GetOrCreate(nameof(ConnectWhenSwitching) + 1);
                var session2   = sessionProvider.GetOrCreate(nameof(ConnectWhenSwitching) + 2);
                var switchTask = sessionProvider.TrySwitchBrokerAsync(nameof(RSessionProviderTest) + nameof(ConnectWhenSwitching));

                var startHost1Task = Task.Delay(50).ContinueWith(t => session1.EnsureHostStartedAsync(new RHostStartupInfo(), null, 1000)).Unwrap();
                var startHost2Task = Task.Delay(100).ContinueWith(t => session2.EnsureHostStartedAsync(new RHostStartupInfo(), null, 1000)).Unwrap();

                await ParallelTools.WhenAll(30000, switchTask, startHost1Task, startHost2Task);

                startHost1Task.Should().BeRanToCompletion();
                startHost2Task.Should().BeRanToCompletion();

                await ParallelTools.WhenAll(30000, session1.HostStarted, session2.HostStarted);
            }
        }
Пример #28
0
        public async Task Concurrent_ReadWriteRead_CancelSecond()
        {
            var task  = _arwl.ReaderLockAsync(CancellationToken.None);
            var tasks = await ParallelTools.InvokeAsync(12, i => {
                var cts   = new CancellationTokenSource();
                var task1 = _arwl.WriterLockAsync(cts.Token);
                var task2 = _arwl.ReaderLockAsync(CancellationToken.None);
                cts.Cancel();
                return(new[] { task1, task2 });
            }, Task.WhenAll);

            task.Should().BeRanToCompletion();
            foreach (var taskPair in tasks)
            {
                taskPair[0].Should().BeCanceled();
                taskPair[1].Should().BeRanToCompletion();
            }
        }
Пример #29
0
        public async Task SwitchToTheSameBroker()
        {
            using (var sessionProvider = new RSessionProvider(_services)) {
                var session = sessionProvider.GetOrCreate(nameof(SwitchToTheSameBroker));
                session.RestartOnBrokerSwitch = true;

                await sessionProvider.TrySwitchBrokerAsync(nameof(RSessionProviderTest) + nameof(SwitchToTheSameBroker));

                await session.EnsureHostStartedAsync(new RHostStartupInfo(), null, 1000);

                var switch1Task = sessionProvider.TrySwitchBrokerAsync(nameof(RSessionProviderTest) + nameof(SwitchToTheSameBroker) + "1");
                var switch2Task = sessionProvider.TrySwitchBrokerAsync(nameof(RSessionProviderTest) + nameof(SwitchToTheSameBroker) + "1");
                await ParallelTools.WhenAll(30000, switch1Task, switch2Task);

                switch1Task.Status.Should().Be(TaskStatus.RanToCompletion);
                switch2Task.Status.Should().Be(TaskStatus.RanToCompletion);
            }
        }
Пример #30
0
        public async Task ConnectWhenSwitching_SwitchFailed()
        {
            using (var sessionProvider = new RSessionProvider(_services)) {
                await sessionProvider.TrySwitchBrokerAsync(nameof(RSessionProviderTest) + nameof(ConnectWhenSwitching_SwitchFailed));

                var switchTask = sessionProvider.TrySwitchBrokerAsync(nameof(RSessionProviderTest) + nameof(ConnectWhenSwitching_SwitchFailed) + "1", BrokerConnectionInfo.Create(null, "JHFFR", @"\\JHF\F\R"));
                await Task.Yield();

                var session       = sessionProvider.GetOrCreate(nameof(ConnectWhenSwitching_SwitchFailed));
                var startHostTask = session.EnsureHostStartedAsync(new RHostStartupInfo(), null, 1000);

                await ParallelTools.WhenAll(30000, switchTask, startHostTask);

                startHostTask.Should().BeRanToCompletion();
                switchTask.Should().BeRanToCompletion();
                switchTask.Result.Should().BeFalse();
            }
        }