public void FirstMessageWithSequenceNumberTest() { IObjectPool <CachedMessageBlock> pool = new MyTestPooled(); ICacheDataAdapter dataAdapter = new TestCacheDataAdapter(); CachedMessageBlock block = pool.Allocate(); int last = -1; int sequenceNumber = 0; while (block.HasCapacity) { // add message to end of block AddAndCheck(block, dataAdapter, 0, last, sequenceNumber); last++; sequenceNumber += 2; } Assert.Equal(block.OldestMessageIndex, block.GetIndexOfFirstMessageLessThanOrEqualTo(new EventSequenceTokenV2(0))); Assert.Equal(block.OldestMessageIndex, block.GetIndexOfFirstMessageLessThanOrEqualTo(new EventSequenceTokenV2(1))); Assert.Equal(block.NewestMessageIndex, block.GetIndexOfFirstMessageLessThanOrEqualTo(new EventSequenceTokenV2(sequenceNumber - 2))); Assert.Equal(block.NewestMessageIndex - 1, block.GetIndexOfFirstMessageLessThanOrEqualTo(new EventSequenceTokenV2(sequenceNumber - 3))); Assert.Equal(50, block.GetIndexOfFirstMessageLessThanOrEqualTo(new EventSequenceTokenV2(sequenceNumber / 2))); Assert.Equal(50, block.GetIndexOfFirstMessageLessThanOrEqualTo(new EventSequenceTokenV2(sequenceNumber / 2 + 1))); }
public void NextInStreamTest() { IObjectPool <CachedMessageBlock <TestCachedMessage> > pool = new MyTestPooled(); ICacheDataAdapter <TestQueueMessage, TestCachedMessage> dataAdapter = new TestCacheDataAdapter(); CachedMessageBlock <TestCachedMessage> block = pool.Allocate(); int last = 0; int sequenceNumber = 0; // define 2 streams var streams = new[] { new TestStreamIdentity { Guid = Guid.NewGuid() }, new TestStreamIdentity { Guid = Guid.NewGuid() } }; // add both streams interleaved, until lock is full while (block.HasCapacity) { var stream = streams[last % 2]; var message = new TestQueueMessage { StreamGuid = stream.Guid, SequenceToken = new EventSequenceToken(sequenceNumber) }; // add message to end of block AddAndCheck(block, dataAdapter, message, 0, last - 1); last++; sequenceNumber += 2; } // get index of first stream int streamIndex; Assert.IsTrue(block.TryFindFirstMessage(streams[0], TestCacheDataComparer.Instance, out streamIndex)); Assert.AreEqual(0, streamIndex); Assert.AreEqual(0, (block.GetSequenceToken(streamIndex, dataAdapter) as EventSequenceToken).SequenceNumber); // find stream1 messages int iteration = 1; while (block.TryFindNextMessage(streamIndex + 1, streams[0], TestCacheDataComparer.Instance, out streamIndex)) { Assert.AreEqual(iteration * 2, streamIndex); Assert.AreEqual(iteration * 4, (block.GetSequenceToken(streamIndex, dataAdapter) as EventSequenceToken).SequenceNumber); iteration++; } Assert.AreEqual(iteration, TestBlockSize / 2); // get index of first stream Assert.IsTrue(block.TryFindFirstMessage(streams[1], TestCacheDataComparer.Instance, out streamIndex)); Assert.AreEqual(1, streamIndex); Assert.AreEqual(2, (block.GetSequenceToken(streamIndex, dataAdapter) as EventSequenceToken).SequenceNumber); // find stream1 messages iteration = 1; while (block.TryFindNextMessage(streamIndex + 1, streams[1], TestCacheDataComparer.Instance, out streamIndex)) { Assert.AreEqual(iteration * 2 + 1, streamIndex); Assert.AreEqual(iteration * 4 + 2, (block.GetSequenceToken(streamIndex, dataAdapter) as EventSequenceToken).SequenceNumber); iteration++; } Assert.AreEqual(iteration, TestBlockSize / 2); }