Ejemplo n.º 1
0
        public void FillHalfTheBufferThenReadThenWriteTheRemainingSize()
        {
            //arrange
            BytesRingBuffer bytesRingBuffer = new BytesRingBuffer(10);
            string temp = new string('x', 5);
            byte[] tempInBytes = Encoding.UTF8.GetBytes(temp);

            //act
            bytesRingBuffer.Write(tempInBytes, 0, tempInBytes.Length);

            //Assert
            Assert.AreEqual(5, bytesRingBuffer.FreeBytes);

            //act
            byte[] readBuffer = new byte[10];
            int bytesCopied;
            bytesRingBuffer.Read(readBuffer, 0, readBuffer.Length, out bytesCopied);

            //Assert
            Assert.AreEqual(5, bytesRingBuffer.ReadOffset, "ReadOffset should have moved");
            Assert.AreEqual(10, bytesRingBuffer.FreeBytes, "Whole buffer should be free");

            tempInBytes = Encoding.UTF8.GetBytes(new string('x', 10));
            var wrote = bytesRingBuffer.Write(tempInBytes, 0, tempInBytes.Length);
            Assert.IsTrue(wrote, "Should have written the buffer.");

            var read = bytesRingBuffer.Read(readBuffer, 0, readBuffer.Length, out bytesCopied);
            Assert.IsTrue(read, "Should have read the buffer.");
            Assert.AreEqual(new string('x', 10), Encoding.UTF8.GetString(readBuffer), "Should be 10*x");
        }
Ejemplo n.º 2
0
        public void GivenAnEmptyBufferFreeBytesShouldBeTheSizeOfTheBuffer()
        {
            //Arrange & Act
            BytesRingBuffer bytesRingBuffer = new BytesRingBuffer(10);

            //Assert
            Assert.AreEqual(10, bytesRingBuffer.FreeBytes);
            Assert.AreEqual(0, bytesRingBuffer.WriteOffset, "Writeoffset should be zero");
            Assert.AreEqual(0, bytesRingBuffer.ReadOffset, "ReadOffset should be zero");
        }
Ejemplo n.º 3
0
        public void GivenAFullBufferFreeBytesShoulsbeZero()
        {
            //arrange
            BytesRingBuffer bytesRingBuffer = new BytesRingBuffer(10);
            string temp = new string('x', bytesRingBuffer.FreeBytes);
            byte[] tempInBytes = Encoding.UTF8.GetBytes(temp);

            Assert.AreEqual(bytesRingBuffer.FreeBytes, tempInBytes.Length, "Free bytes should equal the length");

            //act
            bytesRingBuffer.Write(tempInBytes, 0, tempInBytes.Length);

            //assert
            Assert.AreEqual(0, bytesRingBuffer.FreeBytes, "There should be no free bytes");
            Assert.AreEqual(bytesRingBuffer.Length, bytesRingBuffer.WriteOffset, "Writeoffset should be equal to length");
            Assert.AreEqual(0, bytesRingBuffer.ReadOffset, "ReadOffset should be zero");
        }
Ejemplo n.º 4
0
        public Session(IStreamHandler streamHandler, Socket socket, Guid sessionId)
        {
            SessionId = sessionId;
            Socket = socket;
            StreamHandler = streamHandler;

            _outgoingBuffer = new BytesRingBuffer(64 * 1024);
            _receiveEventArgs = new SocketAsyncEventArgs { UserToken = this };
            _sendEventArgs = new SocketAsyncEventArgs { UserToken = this, RemoteEndPoint = socket.RemoteEndPoint };

            _sendObservable = _sendEventArgs.ToObservable();
            _sendSubscription = _sendObservable.SubscribeOn(ThreadPoolScheduler.Instance).Subscribe(OnSendCompleted);

            IObservable<byte[]> dataToSend = Observable.FromEventPattern<byte[]>(this, "OnSendAsync").Select(pattern => pattern.EventArgs);

            dataToSend.Subscribe(data =>
                {
                    if (_outgoingBuffer.FreeBytes >= data.Length)
                    {
                        WriteToSendBuffer(data);
                    }
                    else
                    {
                        _outgoingBuffer.NotifyFreeSpace(data.Length, _freeSpaceHandler);

                        if (!_freeSpaceHandler.WaitOne(5000) && _outgoingBuffer.FreeBytes < data.Length)
                        {
                            //Slow consumer
                            Trace.TraceError("Slow consumer detected. Closing Socket to {0}.", Socket.RemoteEndPoint);
                            Close();
                        }
                        else
                        {
                            WriteToSendBuffer(data);
                        }
                    }
                });
        }
Ejemplo n.º 5
0
        public void GivenAnHalfEmptyBufferFreeBytesShouldBeTheHalfTheSizeOfTheBuffer()
        {
            //arrange
            BytesRingBuffer bytesRingBuffer = new BytesRingBuffer(10);
            string temp = new string('x', 5);
            byte[] tempInBytes = Encoding.UTF8.GetBytes(temp);

            Assert.AreEqual(5, tempInBytes.Length);

            //act
            bytesRingBuffer.Write(tempInBytes, 0, tempInBytes.Length);

            //assert
            Assert.AreEqual(5, bytesRingBuffer.FreeBytes, "Free bytes should be 5");
            Assert.AreEqual(5, bytesRingBuffer.WriteOffset, "WriteOffset should be 5");

            Assert.AreEqual(0, bytesRingBuffer.ReadOffset, "ReadOffset should be zero");
        }
Ejemplo n.º 6
0
        public void RandomlyWriteAndReadFromBuffer()
        {
            //arrange
            int length = _rng.Next(1000, 100000);
            string message = RandomString(length);
            byte[] source = Encoding.UTF8.GetBytes(message);
            byte[] destination = new byte[length];

            int readOffset = 0, writeOffset = 0;
            BytesRingBuffer bytesRingBuffer = new BytesRingBuffer(256);

            //act
            while (writeOffset < source.Length)
            {
                int randomWrites = _rng.Next(1, Math.Min(bytesRingBuffer.FreeBytes, source.Length - writeOffset));
                bytesRingBuffer.Write(source, writeOffset, randomWrites);
                writeOffset += randomWrites;

                int tempReadoffset = 0;
                while (tempReadoffset < randomWrites)
                {
                    int remaining = randomWrites - tempReadoffset;

                    int randomRead = _rng.Next(1, remaining);

                    int bytesCopied;
                    bytesRingBuffer.Read(destination, readOffset, randomRead, out bytesCopied);
                    readOffset += randomRead;
                    tempReadoffset += randomRead;
                }
            }

            //assert
            Assert.AreEqual(message, Encoding.UTF8.GetString(destination));
        }