public void CheckAllMessagesInOrder()
{
_currentNumber = 1;
var port = NetworkUtils.GetRandomUnusedPort();
var ipEndPoint = new IPEndPoint(IPAddress.Parse("127.0.0.1"), port);
var transport = new SendingTransport();
var sender = new TcpTransportPipeMultiThread(100000, HighWaterMarkBehavior.Block, ipEndPoint, transport);
var receiver = new TcpReceiver();
var waitHandle = new AutoResetEvent(false);
var batchSize = 2000000;
receiver.RegisterCallback(ipEndPoint, s => OnCheckErrorMessageReceived(s, waitHandle, batchSize));
var beforebindDataCount = 100;
for (int i = 1; i < beforebindDataCount; i++)
{
sender.Send(new ArraySegment<byte>(BitConverter.GetBytes(i)));
}
Thread.Sleep(800);
receiver.ListenToEndpoint(ipEndPoint);
SpinWait.SpinUntil(() => _currentNumber == beforebindDataCount);
Console.WriteLine("received first messages");
var watch = new Stopwatch();
watch.Start();
for (int i = beforebindDataCount; i < batchSize / 2; i++)
{
sender.Send(new ArraySegment<byte>(BitConverter.GetBytes(i)));
}
Console.WriteLine("stoppping reception on endpoint");
SpinWait.SpinUntil(() => _currentNumber >= batchSize / 2);
receiver.StopListeningTo(ipEndPoint);
Thread.Sleep(100);
Console.WriteLine("re-establishing reception on endpoint");
sender.Send(new ArraySegment<byte>(BitConverter.GetBytes(batchSize / 2)));
sender.Send(new ArraySegment<byte>(BitConverter.GetBytes(batchSize / 2 + 1)));
Thread.Sleep(100);
receiver.ListenToEndpoint(ipEndPoint);
Thread.Sleep(500);
for (int i = batchSize / 2 +2; i < batchSize; i++)
{
// sender.Send(ipEndPoint, BitConverter.GetBytes(i));
sender.Send(new ArraySegment<byte>(BitConverter.GetBytes(i)));
}
Console.WriteLine("sent last messages");
waitHandle.WaitOne();
if(_currentNumber != batchSize)
Assert.Fail();
watch.Stop();
var fps = batchSize / (watch.ElapsedMilliseconds / 1000m);
Console.WriteLine(string.Format("FPS = : {0} mess/sec, elapsed : {1} ms, messages {2}", fps.ToString("N2"), watch.ElapsedMilliseconds, batchSize));
sender.Dispose();
transport.Dispose();
receiver.Dispose();
Thread.Sleep(500);
}