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