Пример #1
0
        public void WhenControllerStartsItProcessesMessages()
        {
            // arrange
            var okayToWriteEvent = new ManualResetEventSlim();
            var closeSocketEvent = new ManualResetEventSlim();
            var onStartHappened  = new ManualResetEventSlim();

            var listeningEvent = new ManualResetEventSlim();
            var serverTask     = Server.CreateServer(4998, listeningEvent,
                                                     listener =>
            {
                var socket = listener.Accept();

                okayToWriteEvent.Wait();
                socket.Send(new[] { MessageTypes.Start });
                closeSocketEvent.Wait();

                socket.Shutdown(SocketShutdown.Both);
                socket.Close();
            });

            if (!listeningEvent.Wait(5000))
            {
                Assert.Fail("Expected server to start listening");
            }

            var socketFactory = new SocketFactory("127.0.0.1", 4998, 1);
            var errorHandler  = new ErrorHandler();

            // act
            var controller = new Controller(
                new SocketConnection(socketFactory.Connect()),
                new ProtocolVersion(errorHandler),
                10,
                new ControlMessageHandler(onStartHappened),
                new Mock <IConfigurationHandler>().Object,
                new HeartbeatInformer(),
                errorHandler,
                new Mock <ILog>().Object);

            okayToWriteEvent.Set();
            onStartHappened.Wait();

            // assert
            Assert.IsTrue(controller.IsRunning);

            controller.Shutdown();

            closeSocketEvent.Set();
            serverTask.Wait(TimeSpan.FromMilliseconds(5000));
            serverTask.Dispose();
        }
Пример #2
0
        private bool Start()
        {
            try
            {
                for (var i = 0; i < _numSenders; i++)
                {
                    var socket = _socketFactory.Connect();
                    if (socket == null)
                    {
                        _errorHandler.HandleError($"Failed to open HQ Data connection to host {_socketFactory.Host} on port {_socketFactory.Port} with a retry of {_socketFactory.RetryDurationInMilliseconds} millisecond(s).");
                        return(false);
                    }

                    var socketConnection = new SocketConnection(socket);
                    try
                    {
                        _dataConnectionHandshake.PerformHandshake(_runId, socketConnection);
                    }
                    catch (HandshakeException ex)
                    {
                        socketConnection.Close();

                        _errorHandler.HandleError("Unable to perform data connection handshake.", ex);
                        return(false);
                    }

                    _connections.Add(socketConnection);
                    _senders.Add(new PooledMessageSender(_bufferPool,
                                                         socketConnection.OutputWriter,
                                                         _errorHandler,
                                                         _logger));
                }
            }
            catch (Exception ex)
            {
                _errorHandler.HandleError("Failed to start the MessageSenderManager.", ex);
                return(false);
            }

            return(true);
        }
Пример #3
0
        public void WhenControllerHeartbeatIntervalChangesHeartbeatChanges()
        {
            // arrange
            var closeSocketEvent = new ManualResetEventSlim();
            var listeningEvent   = new ManualResetEventSlim();

            var heartbeatTimes = new List <DateTime>();
            var serverTask     = Server.CreateServer(4998, listeningEvent,
                                                     listener =>
            {
                var socket            = listener.Accept();
                socket.ReceiveTimeout = 1;

                while (!closeSocketEvent.Wait(TimeSpan.FromMilliseconds(1)))
                {
                    var buffer = new byte[50];
                    try
                    {
                        var bytesRead = socket.Receive(buffer);
                        if (bytesRead > 0)
                        {
                            if (buffer[0] == MessageTypes.Heartbeat)
                            {
                                heartbeatTimes.Add(DateTime.UtcNow);
                            }
                            Array.Clear(buffer, 0, buffer.Length);
                        }
                    }
                    catch
                    {
                        // ignored
                    }
                }

                closeSocketEvent.Wait();
                socket.Shutdown(SocketShutdown.Both);
                socket.Close();
            });

            if (!listeningEvent.Wait(5000))
            {
                Assert.Fail("Expected server to start listening");
            }

            var socketFactory = new SocketFactory("127.0.0.1", 4998, 1);
            var errorHandler  = new ErrorHandler();

            // act
            var controller = new Controller(
                new SocketConnection(socketFactory.Connect()),
                new ProtocolVersion(errorHandler),
                3000,
                new Mock <IControlMessageHandler>().Object,
                new Mock <IConfigurationHandler>().Object,
                new HeartbeatInformer(),
                errorHandler,
                new Mock <ILog>().Object);

            Thread.Sleep(10000);
            controller.SetHeartbeatInterval(500);
            Thread.Sleep(10000);

            controller.Shutdown();

            // assert
            Assert.IsTrue(heartbeatTimes.Count > 4);

            var slowHeartbeatTimeFrequency = heartbeatTimes[2].Subtract(heartbeatTimes[1]).TotalMilliseconds;
            var fastHeartbeatTimeFrequency = heartbeatTimes[heartbeatTimes.Count - 1].Subtract(heartbeatTimes[heartbeatTimes.Count - 2]).TotalMilliseconds;

            // Runs in a local environment have heartbeats at ~3100 for slow and ~600 for fast, but on the build
            // server heartbeats can be at ~4100 for slow and ~1600 for fast, so pass this test if there's a
            // significant difference between the slow and fast heartbeats
            if (slowHeartbeatTimeFrequency - fastHeartbeatTimeFrequency <= 1750)
            {
                for (var index = 0; index < heartbeatTimes.Count; index++)
                {
                    if (index == 0)
                    {
                        continue;
                    }

                    Console.WriteLine(heartbeatTimes[index].Subtract(heartbeatTimes[index - 1]).TotalMilliseconds);
                }
                Assert.Fail($"Unexpected values for fastHeartbeatTimeFrequency ({fastHeartbeatTimeFrequency}) and slowHeartbeatTimeFrequency ({slowHeartbeatTimeFrequency})");
            }

            closeSocketEvent.Set();
            serverTask.Wait();
            serverTask.Dispose();
        }