public void ExpireOfExpiredRecordProduceWriteConflict()
        {
            var memoryManager = new MemoryManager();

            var content = new byte[] { 0, 1 };

            var recordReference = VersionedRecord.CreateNew(content, 0, memoryManager);

            var snapshotData = new SnapshotData(new int[] { });

            var record = new VersionedRecord(memoryManager.Get(recordReference).RawData, memoryManager, snapshotData);

            record.Expire(0);                                                                        // zero transaction expires the record
            Assert.That(() => record.Expire(1), Throws.Exception.TypeOf <WriteConflictException>()); // first transaction trying to expire it
        }
        public void ExpiredVersionIsInvisible()
        {
            var memoryManager = new MemoryManager();

            var content = new byte[] { 0, 1 };

            var recordReference = VersionedRecord.CreateNew(content, 0, memoryManager);

            var snapshotData = new SnapshotData(new int[] { });

            var record = new VersionedRecord(memoryManager.Get(recordReference).RawData, memoryManager, snapshotData);

            record.Expire(0);

            Assert.IsFalse(record.HasVisibleVersionTo(0));
        }
        public void UpdateRecordExpiredByRolledBackTransaction()
        {
            var memoryManager = new MemoryManager();

            var content    = new byte[] { 0, 1 };
            var newContent = new byte[] { 2, 3 };

            var recordReference = VersionedRecord.CreateNew(content, 0, memoryManager);

            var snapshotData = new SnapshotData(new[] { 0 });

            var record = new VersionedRecord(memoryManager.Get(recordReference).RawData, memoryManager, snapshotData);

            var newReference = record.Expire(1);

            snapshotData = new SnapshotData(new[] { 0 }, new[] { 1 });

            record = new VersionedRecord(memoryManager.Get(newReference).RawData, memoryManager, snapshotData);

            record.Update(newContent, 2);
            Assert.IsTrue(newContent.SequenceEqual(record.GetMatchingVersion(2).RawData));
        }
        public void ResurrectRecordExpiredByCommitedTransaction()
        {
            var memoryManager = new MemoryManager();

            var content    = new byte[] { 0, 1 };
            var newContent = new byte[] { 2, 3 };

            var recordReference = VersionedRecord.CreateNew(content, 0, memoryManager);

            var snapshotData = new SnapshotData(new int[] { });

            var record = new VersionedRecord(memoryManager.Get(recordReference).RawData, memoryManager, snapshotData);

            var newReference = record.Expire(0);

            snapshotData = new SnapshotData(new[] { 0 });

            record = new VersionedRecord(memoryManager.Get(newReference).RawData, memoryManager, snapshotData);

            record.Insert(newContent, 1);
            Assert.IsTrue(newContent.SequenceEqual(record.GetMatchingVersion(1).RawData));
        }