public void TestWriteLock()
        {
            var systemClock = new SystemClock();

            var site = new Site(1, new SiteList(systemClock), systemClock);
            var tempVariable = new Variable(1, site, systemClock);

            var transactionOne = new Transaction("T1", systemClock);
            var transactionTwo = new Transaction("T2", systemClock);

            var result = tempVariable.GetWriteLock(transactionOne);

            Assert.IsTrue(result.Contains(transactionOne));
            Assert.IsTrue(tempVariable.WriteLockHolder == transactionOne);

            var resultTwo = tempVariable.GetReadLock(transactionTwo);
            Assert.IsFalse(resultTwo.Contains(transactionTwo));
            Assert.IsTrue(resultTwo.Contains(transactionOne));

            var resultThree = tempVariable.GetWriteLock(transactionTwo);
            Assert.IsFalse(resultThree.Contains(transactionTwo));
            Assert.IsTrue(resultThree.Contains(transactionOne));

            tempVariable.RemoveWriteLock(transactionOne);

            Assert.IsTrue(tempVariable.WriteLockHolder == null);
        }
        public void TestAcquireAndRemoveReadLock()
        {
            var systemClock = new SystemClock();

            var site = new Site(1, new SiteList(systemClock), systemClock);
            var tempVariable = new Variable(1, site, systemClock);

            var transactionOne = new Transaction("T1", systemClock);
            var transactionTwo = new Transaction("T2", systemClock);

            var result = tempVariable.GetReadLock(transactionOne);
            Assert.IsTrue(result.Contains(transactionOne));

            var result2 = tempVariable.GetReadLock(transactionTwo);
            Assert.IsTrue(result.Contains(transactionOne));
            Assert.IsTrue(result.Contains(transactionTwo));

            tempVariable.RemoveReadLock(transactionOne);
            Assert.IsFalse(tempVariable.ReadLockHolders.Contains(transactionOne));

            tempVariable.RemoveReadLock(transactionTwo);
            Assert.IsFalse(tempVariable.ReadLockHolders.Contains(transactionTwo));
        }
        public void TestVariableResetOnFailure()
        {
            var systemClock = new SystemClock();
            var site = new Site(1, new SiteList(systemClock), systemClock);
            var variable = new Variable(1, site, systemClock);

            var transactionOne = new Transaction("T1", systemClock);

            variable.GetReadLock(transactionOne);
            variable.GetWriteLock(transactionOne);

            Assert.IsTrue(variable.IsReadLocked);
            Assert.IsTrue(variable.IsWriteLocked);
            Assert.IsTrue(variable.ReadLockHolders.Contains(transactionOne));
            Assert.IsTrue(variable.WriteLockHolder == transactionOne);

            variable.ResetToComitted();

            Assert.IsFalse(variable.IsReadLocked);
            Assert.IsFalse(variable.IsWriteLocked);
            Assert.IsFalse(variable.ReadLockHolders.Contains(transactionOne));
            Assert.IsFalse(variable.WriteLockHolder == transactionOne);
        }