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); }
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(); }
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()); }