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"); }
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"); }
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"); }
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); } } }); }
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"); }
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)); }