public void BlockQueueUntilBelowBoundedCapacity()
            {
                var monitor       = new FakeMonitor();
                var threadPool    = new FakeThreadPool();
                var blocked       = new ManualResetEvent(false);
                var released      = new ManualResetEvent(false);
                var taskScheduler = new PartitionedTaskScheduler(_ => 0, 1, 1, threadPool, monitor);

                monitor.BeforeWait = () => blocked.Set();
                monitor.AfterPulse = () => released.Set();

                Task.Factory.StartNew(() =>
                {
                    // Schedule first task (non-blocking).
                    Task.Factory.StartNew(() => { }, CancellationToken.None, TaskCreationOptions.AttachedToParent, taskScheduler);

                    // Schedule second task (blocking).
                    Task.Factory.StartNew(() => { }, CancellationToken.None, TaskCreationOptions.AttachedToParent, taskScheduler);
                });

                // Wait for second task to be blocked.
                Assert.True(blocked.WaitOne(TimeSpan.FromMilliseconds(100)));
                Assert.Equal(1, threadPool.UserWorkItems.Count);

                threadPool.RunNext();

                // Wait for second task to be released.
                Assert.True(released.WaitOne(TimeSpan.FromMilliseconds(100)));

                threadPool.RunNext();

                Assert.Equal(0, taskScheduler.ScheduledTasks.Count());
            }
            public void BlockQueueUntilBelowBoundedCapacity()
            {
                var monitor = new FakeMonitor();
                var threadPool = new FakeThreadPool();
                var blocked = new ManualResetEvent(false);
                var released = new ManualResetEvent(false);
                var taskScheduler = new BlockingThreadPoolTaskScheduler(1, threadPool, monitor);

                monitor.BeforeWait = () => blocked.Set();
                monitor.AfterPulse = () => released.Set();

                Task.Factory.StartNew(() =>
                    {
                        // Schedule first task (non-blocking).
                        Task.Factory.StartNew(() => { }, CancellationToken.None, TaskCreationOptions.AttachedToParent, taskScheduler);

                        // Schedule second task (blocking).
                        Task.Factory.StartNew(() => { }, CancellationToken.None, TaskCreationOptions.AttachedToParent, taskScheduler);
                    });

                // Wait for second task to be blocked.
                Assert.True(blocked.WaitOne(TimeSpan.FromMilliseconds(100)));
                Assert.Equal(1, threadPool.UserWorkItems.Count);

                threadPool.RunNext();

                // Wait for second task to be released.
                Assert.True(released.WaitOne(TimeSpan.FromMilliseconds(100)));

                threadPool.RunNext();

                Assert.Equal(0, taskScheduler.ScheduledTasks.Count());
            }
        public void Monitor_is_not_registered_when_not_added_to_the_list_of_registered_monitors()
        {
            var monitor = new FakeMonitor();

            var isRegistered = _okanshiMonitorRegistry.IsRegistered(monitor);

            isRegistered.Should().BeFalse();
        }
        public void Monitor_can_be_unregistered()
        {
            var monitor = new FakeMonitor();

            _okanshiMonitorRegistry.GetOrAdd(monitor.Config, _ => monitor);

            _okanshiMonitorRegistry.Unregister(monitor);

            _okanshiMonitorRegistry.GetRegisteredMonitors().Should().BeEmpty();
        }
        public void Get_or_add_two_monitors_of_different_types_result_in_two_registrations()
        {
            var monitor        = new FakeMonitor();
            var anotherMonitor = new FakeMonitor2();

            _okanshiMonitorRegistry.GetOrAdd(monitor.Config, _ => monitor);
            _okanshiMonitorRegistry.GetOrAdd(anotherMonitor.Config, _ => anotherMonitor);

            _okanshiMonitorRegistry.GetRegisteredMonitors().Should().HaveCount(2);
        }
        public void Get_or_add_two_monitors_of_same_type_with_differrent_tags_returns_the_newly_registrated_instance()
        {
            var monitor        = new FakeMonitor();
            var anotherMonitor = new FakeMonitor(new[] { new Tag("Test", "Test"), });

            _okanshiMonitorRegistry.GetOrAdd(monitor.Config, _ => monitor);

            var result = _okanshiMonitorRegistry.GetOrAdd(anotherMonitor.Config, _ => anotherMonitor);

            result.Should().BeSameAs(anotherMonitor);
        }
        public void Get_or_add_two_monitors_of_same_type_with_different_tags_result_in_two_registrations()
        {
            var monitor        = new FakeMonitor();
            var anotherMonitor = new FakeMonitor(new[] { new Tag("Test", "Test"), });

            _okanshiMonitorRegistry.GetOrAdd(monitor.Config, _ => monitor);

            _okanshiMonitorRegistry.GetOrAdd(anotherMonitor.Config, _ => anotherMonitor);

            _okanshiMonitorRegistry.GetRegisteredMonitors().Should().HaveCount(2);
        }
        public void Get_or_add_two_monitors_of_same_type_with_same_tags_returns_the_first_registrated_instance()
        {
            var monitor        = new FakeMonitor();
            var anotherMonitor = new FakeMonitor();

            _okanshiMonitorRegistry.GetOrAdd(monitor.Config, _ => monitor);

            var result = _okanshiMonitorRegistry.GetOrAdd(anotherMonitor.Config, _ => anotherMonitor);

            result.Should().BeSameAs(monitor);
        }
        public void Get_or_add_two_monitors_of_same_type_with_same_tags_result_in_one_registration()
        {
            var monitor        = new FakeMonitor();
            var anotherMonitor = new FakeMonitor();

            _okanshiMonitorRegistry.GetOrAdd(monitor.Config, _ => monitor);

            _okanshiMonitorRegistry.GetOrAdd(anotherMonitor.Config, _ => anotherMonitor);

            _okanshiMonitorRegistry.GetRegisteredMonitors().Should().HaveCount(1);
        }
Пример #10
0
        public void Monitor_can_be_unrgistered_when_registry_is_used_as_interface()
        {
            IMonitorRegistry registry = new OkanshiMonitorRegistry();
            var monitor = new FakeMonitor();

            registry.GetOrAdd(monitor.Config, _ => monitor);

            registry.Unregister(monitor);

            registry.GetRegisteredMonitors().Should().BeEmpty();
        }
Пример #11
0
            public void AllowsInlineExecutionAfterBeingQueued()
            {
                var executions    = 0;
                var monitor       = new FakeMonitor();
                var threadPool    = new FakeThreadPool();
                var taskScheduler = new BlockingThreadPoolTaskScheduler(1, threadPool, monitor);

                Task.Factory.StartNew(() => { executions++; }, CancellationToken.None, TaskCreationOptions.AttachedToParent, taskScheduler);

                threadPool.RunNext(2);

                Assert.Equal(1, executions);
                Assert.Equal(0, taskScheduler.ScheduledTasks.Count());
            }
            public void AllowsInlineExecutionAfterBeingQueued()
            {
                var executions = 0;
                var monitor = new FakeMonitor();
                var threadPool = new FakeThreadPool();
                var taskScheduler = new BlockingThreadPoolTaskScheduler(1, threadPool, monitor);

                Task.Factory.StartNew(() => { executions++; }, CancellationToken.None, TaskCreationOptions.AttachedToParent, taskScheduler);

                threadPool.RunNext(2);

                Assert.Equal(1, executions);
                Assert.Equal(0, taskScheduler.ScheduledTasks.Count());
            }