Esempio n. 1
0
        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 _));
            }
        }
Esempio n. 2
0
        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);
            }
        }
Esempio n. 3
0
        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);
            }
        }
Esempio n. 4
0
        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 _));
            }
        }
Esempio n. 5
0
        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));
            }
        }