Ejemplo n.º 1
0
        public void Lock_Integration(ALock aLock, BLock bLock, CLock cLock, ALock nullLock)
        {
            nullLock.Lock = null;
            nullLock.Hash = 0;
            aLock.Lock    = new object();
            aLock.Hash    = 1;
            bLock.Lock    = new object();
            bLock.Hash    = 2;
            cLock.Lock    = new object();
            cLock.Hash    = 3;

            Monitor.Enter(cLock.Lock);

            bool locked       = false;
            bool hasException = false;
            var  thread       = new Thread(() =>
            {
                try
                {
                    locker.Lock(new ILockable[] { cLock, nullLock, bLock, aLock }).Do(() =>
                    {
                        locked = true;
                    });
                }
                catch (Exception)
                {
                    hasException = true;
                }
            });

            thread.Start();
            Thread.Sleep(200);

            locked.Should().BeFalse();
            enterObjects.Should().Equal(aLock.Lock, bLock.Lock);

            Monitor.Exit(cLock.Lock);
            thread.Join(1000);

            hasException.Should().BeFalse();
            enterObjects.Should().Equal(aLock.Lock, bLock.Lock, cLock.Lock);
            exitObjects.Should().Equal(cLock.Lock, bLock.Lock, aLock.Lock);
        }
Ejemplo n.º 2
0
        public void UnlockAll_WhenCalled_ShouldAllowToLockAgain(ALock aLock, BLock bLock, CLock cLock)
        {
            aLock.Lock = new object();
            bLock.Lock = new object();
            cLock.Lock = new object();

            aLock.Hash = 100;
            bLock.Hash = 100;
            cLock.Hash = 100;

            locker.Lock(new ILockable[] { aLock, cLock, bLock });
            locker.UnlockAll();

            locker.Lock(new ILockable[] { aLock, cLock, bLock });
            locker.UnlockAll();

            enterObjects.Should().Equal(aLock.Lock, bLock.Lock, cLock.Lock, aLock.Lock, bLock.Lock, cLock.Lock);
            exitObjects.Should().Equal(cLock.Lock, bLock.Lock, aLock.Lock, cLock.Lock, bLock.Lock, aLock.Lock);
        }
Ejemplo n.º 3
0
        public void UnlockAll_WhenCalled_ShouldUnlockObjectsInReverseOrder(ALock aLock, BLock bLock, CLock cLock)
        {
            aLock.Lock = new object();
            bLock.Lock = new object();
            cLock.Lock = new object();

            aLock.Hash = 100;
            bLock.Hash = 100;
            cLock.Hash = 100;

            locker.Lock(new ILockable[] { aLock, cLock, bLock });

            exitObjects.Should().BeEmpty();

            locker.UnlockAll();

            exitObjects.Should().Equal(cLock.Lock, bLock.Lock, aLock.Lock);
        }
Ejemplo n.º 4
0
        public void UnlockAll_WhenCalledMultipleTimes_ShouldNotUnlockObjectsTwice(ALock aLock, BLock bLock, CLock cLock)
        {
            aLock.Lock = new object();
            bLock.Lock = new object();
            cLock.Lock = new object();

            aLock.Hash = 100;
            bLock.Hash = 100;
            cLock.Hash = 100;

            locker.Lock(new ILockable[] { aLock, cLock, bLock });

            locker.UnlockAll();
            locker.UnlockAll();

            exitObjects.Should().Equal(cLock.Lock, bLock.Lock, aLock.Lock);
        }
Ejemplo n.º 5
0
        public void Lock_WhenCalledWithCollidingHashes_ShouldUseTypeNameToSort(ALock aLock, BLock bLock, CLock cLock)
        {
            aLock.Lock = new object();
            bLock.Lock = new object();
            cLock.Lock = new object();

            aLock.Hash = 100;
            bLock.Hash = 100;
            cLock.Hash = 100;

            locker.Lock(new ILockable[] { aLock, cLock, bLock });

            enterObjects.Should().Equal(aLock.Lock, bLock.Lock, cLock.Lock);
        }