public override void Write(string message)
 {
     // Note: not thread-safe, since the threading is handled by the TraceListener machinery that
     // invokes this method.
     if (NeedIndent)
     {
         WriteIndent();
     }
     writer.Enqueue(message);
 }
        public void TestReconnectFailure()
        {
            var listener = new TcpListener(IPAddress.Loopback, 0);

            listener.Start();
            int port = ((IPEndPoint)listener.Server.LocalEndPoint).Port;

            var writer   = new TcpSocketWriter(IPAddress.Loopback, port, new TryOnceTcpConnectionPolicy(), 2);
            var receiver = listener.AcceptTcpClient();

            receiver.Close();

            var errors      = new List <Exception>();
            var errorThrown = false;

            writer.LoggingFailureHandler += (ex) => {
                errorThrown = true;
                errors.Add(ex);
            };
            listener.Stop();

            while (!errorThrown)
            {
                writer.Enqueue("boris\r\n");
            }
            writer.Dispose();

            Assert.Equal(3, errors.Count());
            Assert.True(errors[0] is SocketException);
            Assert.True(errors[1] is SocketException);
            Assert.True(errors[2] is TcpReconnectFailureException);
        }
        public async Task TestEventsQueuedCanBeDropped()
        {
            var listener = new TcpListener(IPAddress.Loopback, 0);

            listener.Start();
            int port = ((IPEndPoint)listener.Server.LocalEndPoint).Port;

            var policy = new TriggeredTcpReconnectionPolicy();

            policy.Trigger();
            var writer = new TcpSocketWriter(IPAddress.Loopback, port, policy, 2);

            var listenerClient = await listener.AcceptTcpClientAsync();

            listenerClient.Close();

            var errors      = new List <Exception>();
            var errorThrown = false;

            writer.LoggingFailureHandler += (ex) =>
            {
                errorThrown = true;
                errors.Add(ex);
            };

            while (!errorThrown)
            {
                writer.Enqueue("boris\r\n");
            }
            for (int i = 0; i < 10; i++)
            {
                writer.Enqueue("boris\r\n");
            }

            policy.Trigger();
            listenerClient = await listener.AcceptTcpClientAsync();

            writer.Dispose();

            var receiverReader = new StreamReader(listenerClient.GetStream());

            // Then check what was left in the queue when we disconnected
            Assert.Equal("boris", await receiverReader.ReadLineAsync());
            Assert.Equal("boris", await receiverReader.ReadLineAsync());
            Assert.Equal(0, listenerClient.Available);
        }
        public async Task TestEventsQueuedWhileWaitingForInitialConnection()
        {
            var listener = new TcpListener(IPAddress.Loopback, 0);

            listener.Start();
            int port = ((IPEndPoint)listener.Server.LocalEndPoint).Port;

            var writer = new TcpSocketWriter(IPAddress.Loopback, port, new ExponentialBackoffTcpReconnectionPolicy(), 100);

            writer.Enqueue("Event 1\r\n");
            writer.Enqueue("Event 2\r\n");

            listener.Start();
            var listenerClient = listener.AcceptTcpClient();
            var receiverReader = new StreamReader(listenerClient.GetStream());

            Assert.Equal("Event 1", await receiverReader.ReadLineAsync());
            Assert.Equal("Event 2", await receiverReader.ReadLineAsync());

            listener.Stop();
            listenerClient.Close();
            writer.Dispose();
        }
        public async Task TestTcpSocketWriter()
        {
            var listener = new TcpListener(IPAddress.Loopback, 0);
            listener.Start();
            int port = ((IPEndPoint)listener.Server.LocalEndPoint).Port;


            var writer = new TcpSocketWriter(IPAddress.Loopback, port, new ExponentialBackoffTcpReconnectionPolicy(), 10);

            var listenerClient = await listener.AcceptTcpClientAsync();

            writer.Enqueue("This is a test.\r\n");

            var receiverReader = new StreamReader(listenerClient.GetStream());
            var line = await receiverReader.ReadLineAsync();

            Assert.Equal(line, "This is a test.");

            listenerClient.Close();
            listener.Stop();
        }
        public async Task TestTcpSocketWriter()
        {
            var listener = new TcpListener(IPAddress.Loopback, 0);

            listener.Start();
            int port = ((IPEndPoint)listener.Server.LocalEndPoint).Port;


            var writer = new TcpSocketWriter(IPAddress.Loopback, port, new ExponentialBackoffTcpReconnectionPolicy(), 10);

            var listenerClient = await listener.AcceptTcpClientAsync();

            writer.Enqueue("This is a test.\r\n");

            var receiverReader = new StreamReader(listenerClient.GetStream());
            var line           = await receiverReader.ReadLineAsync();

            Assert.Equal(line, "This is a test.");

            listenerClient.Close();
            listener.Stop();
        }