public void Wait_Dictionary_And_Queue_Are_Collected_After_Last_Wait_Is_Dequeued() { using (var waiter = new Waiter()) { var waits = waiter.GetProperty <ConcurrentDictionary <WaitKey, ConcurrentQueue <PendingWait> > >("Waits"); var locks = waiter.GetProperty <ConcurrentDictionary <WaitKey, ReaderWriterLockSlim> >("Locks"); int CountWaits(WaitKey k) { waits.TryGetValue(k, out var queue); return(queue?.Count ?? 0); } var key = new WaitKey("foo"); waiter.Wait(key); waiter.Wait(key); Assert.Equal(2, CountWaits(key)); Assert.True(waits.TryGetValue(key, out _)); Assert.True(locks.TryGetValue(key, out _)); waiter.Complete(key); Assert.Equal(1, CountWaits(key)); Assert.True(waits.TryGetValue(key, out _)); Assert.True(locks.TryGetValue(key, out _)); waiter.Complete(key); Assert.Equal(0, CountWaits(key)); Assert.False(waits.TryGetValue(key, out _)); Assert.False(locks.TryGetValue(key, out _)); } }
public void Complete_For_Missing_Wait_Does_Not_Throw() { using (var waiter = new Waiter()) { var ex = Record.Exception(() => waiter.Complete <object>(new WaitKey(MessageCode.Server.AddPrivilegedUser), null)); Assert.Null(ex); } }
public void Non_Generic_Complete_For_Missing_Wait_Does_Not_Throw() { using (var waiter = new Waiter()) { var ex = Record.Exception(() => waiter.Complete(new WaitKey(MessageCode.ServerAddPrivilegedUser))); Assert.Null(ex); } }
public async Task Complete_Dequeues_Wait() { using (var waiter = new Waiter()) { var result = Guid.NewGuid(); var task = waiter.Wait <Guid>(new WaitKey(MessageCode.Server.Login)); waiter.Complete(new WaitKey(MessageCode.Server.Login), result); var waitResult = await task; var key = new WaitKey(MessageCode.Server.Login); var waits = waiter.GetProperty <ConcurrentDictionary <WaitKey, ConcurrentQueue <PendingWait> > >("Waits"); Assert.Equal(result, waitResult); Assert.False(waits.TryGetValue(key, out _)); } }
public void Complete_Does_Not_Remove_Queue_If_Additional_Waits_Are_Enqueued() { int CountWaits(Waiter waiter, WaitKey key) { var waits = waiter.GetProperty <ConcurrentDictionary <WaitKey, ConcurrentQueue <PendingWait> > >("Waits"); waits.TryGetValue(key, out var queue); return(queue?.Count ?? 0); } using (var waiter = new Waiter()) { var key = new WaitKey("foo"); waiter.Wait(key); waiter.Wait(key); Assert.Equal(2, CountWaits(waiter, key)); waiter.Complete(key); Assert.Equal(1, CountWaits(waiter, key)); } }