Commit 167998af authored by Marc Gravell's avatar Marc Gravell

more theory

parent 0d87e836
using System; using System;
using System.Buffers; using System.Buffers;
using System.Collections.Generic;
using System.Text; using System.Text;
using Xunit; using Xunit;
using Xunit.Abstractions; using Xunit.Abstractions;
...@@ -9,47 +10,31 @@ namespace StackExchange.Redis.Tests ...@@ -9,47 +10,31 @@ namespace StackExchange.Redis.Tests
public class Parse : TestBase public class Parse : TestBase
{ {
public Parse(ITestOutputHelper output) : base(output) { } public Parse(ITestOutputHelper output) : base(output) { }
public static IEnumerable<object[]> GetTestData()
{
yield return new object[] { "$4\r\nPING\r\n$4\r\nPONG\r\n", 2 };
yield return new object[] { "$4\r\nPING\r\n$4\r\nPONG\r\n$4\r", 2 };
}
[Theory] [Theory]
[InlineData("$4\r\nPING\r\n$4\r\nPONG\r\n$4\r\r", 2)] [MemberData(nameof(GetTestData))]
public void ParseAsSingleChunk(string ascii, int expected) public void ParseAsSingleChunk(string ascii, int expected)
{ {
ReadOnlySequence<byte> buffer = new ReadOnlySequence<byte>(Encoding.ASCII.GetBytes(ascii)); var buffer = new ReadOnlySequence<byte>(Encoding.ASCII.GetBytes(ascii));
ProcessMessages(buffer, expected);
var reader = new BufferReader(buffer);
RawResult result;
int found = 0;
while(!(result = PhysicalConnection.TryParseResult(buffer, ref reader, false, null, false)).IsNull)
{
Writer.WriteLine($"{result} - {result.GetString()}");
found++;
}
Assert.Equal(expected, found);
} }
class FragmentedSegment : ReadOnlySequenceSegment<byte>
{
public FragmentedSegment(long runningIndex, ReadOnlyMemory<byte> memory)
{
RunningIndex = runningIndex;
Memory = memory;
}
public new FragmentedSegment Next
{
get => (FragmentedSegment)base.Next;
set => base.Next = value;
}
}
[Theory] [Theory]
[InlineData("$4\r\nPING\r\n$4\r\nPONG\r\n$4\r\r", 2)] [MemberData(nameof(GetTestData))]
public void ParseAsLotsOfChunks(string ascii, int messages) public void ParseAsLotsOfChunks(string ascii, int expected)
{ {
var bytes = Encoding.ASCII.GetBytes(ascii); var bytes = Encoding.ASCII.GetBytes(ascii);
FragmentedSegment chain = null, tail = null; FragmentedSegment<byte> chain = null, tail = null;
for(int i = 0; i < bytes.Length; i++) for (int i = 0; i < bytes.Length; i++)
{ {
var next = new FragmentedSegment(i, new ReadOnlyMemory<byte>(bytes, i, 1)); var next = new FragmentedSegment<byte>(i, new ReadOnlyMemory<byte>(bytes, i, 1));
if(tail == null) if (tail == null)
{ {
chain = next; chain = next;
} }
...@@ -59,11 +44,14 @@ public void ParseAsLotsOfChunks(string ascii, int messages) ...@@ -59,11 +44,14 @@ public void ParseAsLotsOfChunks(string ascii, int messages)
} }
tail = next; tail = next;
} }
var buffer = new ReadOnlySequence<byte>(chain, 0, tail, 0);
ReadOnlySequence<byte> buffer = new ReadOnlySequence<byte>(chain, 0, tail, 0); ProcessMessages(buffer, expected);
Writer.WriteLine($"chain: {buffer.Length}");
}
void ProcessMessages(ReadOnlySequence<byte> buffer, int expected)
{
Writer.WriteLine($"chain: {buffer.Length}");
var reader = new BufferReader(buffer); var reader = new BufferReader(buffer);
RawResult result; RawResult result;
int found = 0; int found = 0;
...@@ -72,7 +60,22 @@ public void ParseAsLotsOfChunks(string ascii, int messages) ...@@ -72,7 +60,22 @@ public void ParseAsLotsOfChunks(string ascii, int messages)
Writer.WriteLine($"{result} - {result.GetString()}"); Writer.WriteLine($"{result} - {result.GetString()}");
found++; found++;
} }
Assert.Equal(messages, found); Assert.Equal(expected, found);
}
class FragmentedSegment<T> : ReadOnlySequenceSegment<T>
{
public FragmentedSegment(long runningIndex, ReadOnlyMemory<T> memory)
{
RunningIndex = runningIndex;
Memory = memory;
}
public new FragmentedSegment<T> Next
{
get => (FragmentedSegment<T>)base.Next;
set => base.Next = value;
}
} }
} }
} }
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment