public void WhenAReadOperationIsBeingPerformed_ThenWritesAreNotProcessedUntilTheReadOperationIsDone() { var lastUpdate = "none"; var readSync = new AutoResetEvent(false); var writeSync = new AutoResetEvent(false); var barrier = new Barrier(2); ThreadPool.QueueUserWorkItem((o) => { readSync.WaitOne(2000); this.coordinator.ExecuteReadOperation(() => { writeSync.Set(); Thread.Sleep(1000); lastUpdate = "read"; }); barrier.Await(); }); readSync.Set(); writeSync.WaitOne(2000); this.coordinator.ExecuteWriteOperation(() => { lastUpdate = "write"; }); barrier.Await(); Assert.AreEqual("write", lastUpdate); }
public void WhenAReadOperationIsBeingPerformed_ThenWritesAreNotProcessedUntilTheReadOperationIsDone() { var lastUpdate = "none"; var readSync = new AutoResetEvent(false); var writeSync = new AutoResetEvent(false); var barrier = new Barrier(2); ThreadPool.QueueUserWorkItem((o) => { readSync.WaitOne(2000); this.coordinator.ExecuteReadOperation(() => { writeSync.Set(); Thread.Sleep(1000); lastUpdate = "read"; }); barrier.Await(); }); readSync.Set(); writeSync.WaitOne(2000); this.coordinator.ExecuteWriteOperation(() => { lastUpdate = "write"; }); barrier.Await(); Assert.AreEqual("write", lastUpdate); }
public void WhenConfigurationChangeEventSourceRaisesItsEvent_ThenTheUpdateHandlerCommitsAreGuardedByTheWriterLock() { var lastUpdate = "none"; var updateSync = new AutoResetEvent(false); var readSync = new AutoResetEvent(false); var barrier = new Barrier(2); var updateHandler = new Mock <ILoggingUpdateHandler>(); updateHandler.Setup(h => h.CommitUpdate(It.IsAny <object>())) .Callback(() => { readSync.Set(); Thread.Sleep(1000); lastUpdate = "config update"; }); this.coordinator.RegisterLoggingUpdateHandler(updateHandler.Object); ThreadPool.QueueUserWorkItem((o) => { updateSync.WaitOne(2000); this.source.OnSectionChanged <LoggingSettings>( new SectionChangedEventArgs <LoggingSettings>(new LoggingSettings(), this.locator)); barrier.Await(); }); updateSync.Set(); readSync.WaitOne(2000); this.coordinator.ExecuteReadOperation(() => { lastUpdate = "read"; }); barrier.Await(); Assert.AreEqual("read", lastUpdate); }
public void WhenConfigurationChangeEventSourceRaisesItsEvent_ThenTheUpdateHandlerCommitsAreGuardedByTheWriterLock() { var lastUpdate = "none"; var updateSync = new AutoResetEvent(false); var readSync = new AutoResetEvent(false); var barrier = new Barrier(2); var updateHandler = new Mock<ILoggingUpdateHandler>(); updateHandler.Setup(h => h.CommitUpdate(It.IsAny<object>())) .Callback(() => { readSync.Set(); Thread.Sleep(1000); lastUpdate = "config update"; }); this.coordinator.RegisterLoggingUpdateHandler(updateHandler.Object); ThreadPool.QueueUserWorkItem((o) => { updateSync.WaitOne(2000); this.source.OnSectionChanged<LoggingSettings>( new SectionChangedEventArgs<LoggingSettings>(new LoggingSettings(), this.locator)); barrier.Await(); }); updateSync.Set(); readSync.WaitOne(2000); this.coordinator.ExecuteReadOperation(() => { lastUpdate = "read"; }); barrier.Await(); Assert.AreEqual("read", lastUpdate); }