Files
quantconnect--lean/UserInterface/Tests/DesktopClientTests.cs
Andrew Hart 62592398e2 DesktopClient now uses volitile bool to shutdown.
In order to safely be accessed across threads, the private bool which dictates whether or not the DesktopClient is running has been decorated with the volitile keyword.  This should enable the DesktopClient to safely be shutdown from another thread.
2016-09-01 11:14:50 -04:00

153 lines
4.8 KiB
C#

using System;
using System.Collections.Generic;
using System.Net;
using System.Net.Sockets;
using System.Threading;
using Moq;
using NetMQ;
using NetMQ.Sockets;
using Newtonsoft.Json;
using NUnit.Framework;
using QuantConnect.Packets;
namespace QuantConnect.Views.Tests
{
[TestFixture, Ignore("This test requires an open TCP to be configured.")]
class DesktopClientTests
{
private string _port = "1235";
private Thread _thread;
private DesktopClient _desktopMessageHandler;
[TestFixtureSetUp]
public void Setup()
{
_desktopMessageHandler = new DesktopClient();
}
[TestFixtureTearDown]
public void TearDown()
{
_desktopMessageHandler.StopServer();
_thread.Join();
}
private void StartClientThread(IDesktopMessageHandler messageHandler)
{
_thread = new Thread(() => _desktopMessageHandler.Run(_port, messageHandler));
_thread.SetApartmentState(ApartmentState.STA);
_thread.Start();
}
[Test]
public void DesktopClient_WillAccept_SinglePartMessages()
{
Queue<Packet> packets = new Queue<Packet>();
// Mock the the message handler processor
var messageHandler = new Mock<IDesktopMessageHandler>();
messageHandler.Setup(mh => mh.DisplayLogPacket(It.IsAny<LogPacket>())).Callback(
(LogPacket packet) =>
{
packets.Enqueue(packet);
}).Verifiable();
// Setup Client
StartClientThread(messageHandler.Object);
using (PushSocket server = new PushSocket("@tcp://*:" + _port))
{
var message = new NetMQMessage();
message.Append(JsonConvert.SerializeObject(new LogPacket()));
server.SendMultipartMessage(message);
}
// Give NetMQ time to send the message
Thread.Sleep(500);
Assert.IsTrue(packets.Count == 1);
}
[Test]
public void DesktopClient_WillNotAccept_MoreThanOnePartMessages()
{
Queue<Packet> packets = new Queue<Packet>();
// Mock the the message handler processor
var messageHandler = new Mock<IDesktopMessageHandler>();
messageHandler.Setup(mh => mh.DisplayLogPacket(It.IsAny<LogPacket>()))
.Callback((LogPacket packet) =>
{
packets.Enqueue(packet);
})
.Verifiable();
// Setup Client
StartClientThread(messageHandler.Object);
using (PushSocket server = new PushSocket("@tcp://*:" + _port))
{
var message = new NetMQMessage();
message.Append(typeof(LogPacket).Name);
message.Append(JsonConvert.SerializeObject(new LogPacket()));
message.Append("hello!");
server.SendMultipartMessage(message);
}
// Give NetMQ time to send the message
Thread.Sleep(500);
Assert.IsTrue(packets.Count == 0);
}
[Test]
public void DesktopClient_WillShutDown_WhenStopServerIsCalled_FromAnotherThread()
{
Queue<Packet> packets = new Queue<Packet>();
var messageHandler = new Mock<IDesktopMessageHandler>();
messageHandler.Setup(mh => mh.DisplayLogPacket(It.IsAny<LogPacket>()))
.Callback((LogPacket packet) =>
{
packets.Enqueue(packet);
})
.Verifiable();
StartClientThread(messageHandler.Object);
// Try to send a message when the DesktopClient is listening
using (PushSocket server = new PushSocket("@tcp://*:" + _port))
{
var message = new NetMQMessage();
message.Append(JsonConvert.SerializeObject(new LogPacket()));
server.SendMultipartMessage(message);
}
// Give NetMQ time to send the message
Thread.Sleep(2000);
Assert.IsTrue(packets.Count == 1);
// Shut down the server
_desktopMessageHandler.StopServer();
Thread.Sleep(2000);
// Try to send another message when the DesktopClient is not listening
using (PushSocket server = new PushSocket("@tcp://*:" + _port))
{
var message = new NetMQMessage();
message.Append(JsonConvert.SerializeObject(new LogPacket()));
server.SendMultipartMessage(message);
}
// Give NetMQ time to send the message
Thread.Sleep(2000);
// Nothing should have made it so the count should be the same
Assert.IsTrue(packets.Count == 1);
}
}
}