Esempio n. 1
0
        public void ShouldReadTwoMessages()
        {
            const int  msgLength           = 16;
            var        recordLength        = RingBufferDescriptor.HeaderLength + msgLength;
            var        alignedRecordLength = recordLength.AlignToMultipleOf(RingBufferDescriptor.RecordAlignment);
            long       tail      = alignedRecordLength * 2;
            const long head      = 0L;
            const int  headIndex = (int)head;

            _atomicLong.Read(Head).Returns(head);
            var makeHeader = RingBufferDescriptor.MakeHeader(recordLength, MessageTypeId);

            _atomicLong.VolatileRead(new IntPtr(headIndex)).Returns(makeHeader);
            _atomicLong.VolatileRead(new IntPtr(headIndex + alignedRecordLength)).Returns(makeHeader);

            var            counter      = 0;
            MessageHandler h            = (id, chunk) => counter++;
            var            messagesRead = _ringBuffer.Read(h, 3);

            Assert.AreEqual(2, messagesRead);
            Assert.AreEqual(2, counter);

            Received.InOrder(() =>
            {
                _buffer.Received(1).ZeroMemory(headIndex, alignedRecordLength * 2);
                _atomicLong.VolatileWrite(Head, tail);
            });
        }