using Quobject.EngineIoClientDotNet.Client; using Quobject.EngineIoClientDotNet.Client.Transports; using Quobject.EngineIoClientDotNet.ComponentEmitter; using System.Collections.Concurrent; using System.Collections.Generic; using System.Threading; using Xunit; namespace Quobject.EngineIoClientDotNet_Tests.ClientTests { public class ServerConnectionTest : Connection { private ManualResetEvent _manualResetEvent = null; [Fact] public void OpenAndClose() { _manualResetEvent = new ManualResetEvent(false); var events = new ConcurrentQueue(); var options = CreateOptions(); options.Query = new Dictionary { { "access_token", "akaka" } }; options.QueryString = "akka=ekek"; var socket = new Socket(options); socket.On(Socket.EVENT_OPEN, () => { events.Enqueue(Socket.EVENT_OPEN); socket.Close(); }); socket.On(Socket.EVENT_CLOSE, () => { //log.Info("EVENT_CLOSE"); events.Enqueue(Socket.EVENT_CLOSE); _manualResetEvent.Set(); }); socket.Open(); _manualResetEvent.WaitOne(); socket.Close(); string result; events.TryDequeue(out result); Assert.Equal(Socket.EVENT_OPEN, result); events.TryDequeue(out result); Assert.Equal(Socket.EVENT_CLOSE, result); } [Fact] public void Messages() { _manualResetEvent = new ManualResetEvent(false); var events = new ConcurrentQueue(); var socket = new Socket(CreateOptions()); socket.On(Socket.EVENT_OPEN, () => { socket.Send("hello"); }); socket.On(Socket.EVENT_MESSAGE, (d) => { var data = (string)d; //log.Info("EVENT_MESSAGE data = " + data); events.Enqueue(data); if (events.Count > 1) { _manualResetEvent.Set(); } }); socket.Open(); _manualResetEvent.WaitOne(); socket.Close(); string result; events.TryDequeue(out result); Assert.Equal("hi", result); events.TryDequeue(out result); Assert.Equal("hello", result); } [Fact] public void Handshake() { _manualResetEvent = new ManualResetEvent(false); HandshakeData handshake_data = null; var socket = new Socket(CreateOptions()); socket.On(Socket.EVENT_HANDSHAKE, (data) => { //log.Info(Socket.EVENT_HANDSHAKE + string.Format(" data = {0}", data)); handshake_data = data as HandshakeData; _manualResetEvent.Set(); }); socket.Open(); _manualResetEvent.WaitOne(); socket.Close(); Assert.NotNull(handshake_data); Assert.NotNull(handshake_data.Upgrades); Assert.True(handshake_data.Upgrades.Count > 0); Assert.True(handshake_data.PingInterval > 0); Assert.True(handshake_data.PingTimeout > 0); } public class TestHandshakeListener : IListener { public HandshakeData HandshakeData; private ServerConnectionTest serverConnectionTest; public TestHandshakeListener(ServerConnectionTest serverConnectionTest) { this.serverConnectionTest = serverConnectionTest; } public void Call(params object[] args) { //log.Info(string.Format("open args[0]={0} args.Length={1}", args[0], args.Length)); HandshakeData = args[0] as HandshakeData; serverConnectionTest._manualResetEvent.Set(); } public int CompareTo(IListener other) { return this.GetId().CompareTo(other.GetId()); } public int GetId() { return 0; } } [Fact] public void Handshake2() { _manualResetEvent = new ManualResetEvent(false); var socket = new Socket(CreateOptions()); var testListener = new TestHandshakeListener(this); socket.On(Socket.EVENT_HANDSHAKE, testListener); socket.Open(); _manualResetEvent.WaitOne(); socket.Close(); Assert.NotNull(testListener.HandshakeData); Assert.NotNull(testListener.HandshakeData.Upgrades); Assert.True(testListener.HandshakeData.Upgrades.Count > 0); Assert.True(testListener.HandshakeData.PingInterval > 0); Assert.True(testListener.HandshakeData.PingTimeout > 0); } [Fact] public void Upgrade() { _manualResetEvent = new ManualResetEvent(false); var events = new ConcurrentQueue(); var socket = new Socket(CreateOptions()); socket.On(Socket.EVENT_UPGRADING, (data) => { //log.Info(Socket.EVENT_UPGRADING + string.Format(" data = {0}", data)); events.Enqueue(data); }); socket.On(Socket.EVENT_UPGRADE, (data) => { //log.Info(Socket.EVENT_UPGRADE + string.Format(" data = {0}", data)); events.Enqueue(data); _manualResetEvent.Set(); }); socket.Open(); _manualResetEvent.WaitOne(); object test = null; events.TryDequeue(out test); Assert.NotNull(test); Assert.IsAssignableFrom(test); events.TryDequeue(out test); Assert.NotNull(test); Assert.IsAssignableFrom(test); } [Fact] public void RememberWebsocket() { _manualResetEvent = new ManualResetEvent(false); var socket1 = new Socket(CreateOptions()); string socket1TransportName = null; string socket2TransportName = null; socket1.On(Socket.EVENT_OPEN, () => { socket1TransportName = socket1.Transport.Name; }); socket1.On(Socket.EVENT_UPGRADE, (data) => { //log.Info(Socket.EVENT_UPGRADE + string.Format(" data = {0}", data)); var transport = (Transport)data; socket1.Close(); if (WebSocket.NAME == transport.Name) { var options = CreateOptions(); options.RememberUpgrade = true; var socket2 = new Socket(options); socket2.Open(); socket2TransportName = socket2.Transport.Name; socket2.Close(); _manualResetEvent.Set(); } }); socket1.Open(); _manualResetEvent.WaitOne(); Assert.Equal(Polling.NAME, socket1TransportName); Assert.Equal(WebSocket.NAME, socket2TransportName); } [Fact] public void NotRememberWebsocket() { _manualResetEvent = new ManualResetEvent(false); var socket1 = new Socket(CreateOptions()); string socket1TransportName = null; string socket2TransportName = null; socket1.On(Socket.EVENT_OPEN, () => { socket1TransportName = socket1.Transport.Name; }); socket1.On(Socket.EVENT_UPGRADE, (data) => { //log.Info(Socket.EVENT_UPGRADE + string.Format(" data = {0}", data)); var transport = (Transport)data; if (WebSocket.NAME == transport.Name) { socket1.Close(); var options = CreateOptions(); options.RememberUpgrade = false; var socket2 = new Socket(options); socket2.On(Socket.EVENT_OPEN, () => { //log.Info("EVENT_OPEN socket 2"); socket2TransportName = socket2.Transport.Name; socket2.Close(); _manualResetEvent.Set(); }); socket2.Open(); } }); socket1.Open(); _manualResetEvent.WaitOne(); Assert.Equal(Polling.NAME, socket1TransportName); Assert.Equal(Polling.NAME, socket2TransportName); } //Fails in .netstandard1.3 for EngineIoClientDotNet 1.0.4 [Fact] public void Cookie() { _manualResetEvent = new ManualResetEvent(false); var events = new Queue(); var options = CreateOptions(); options.Cookies.Add("foo", "bar"); var socket = new Socket(options); socket.On(Socket.EVENT_OPEN, () => { socket.Send("cookie"); }); socket.On(Socket.EVENT_MESSAGE, (d) => { var data = (string)d; //log.Info("EVENT_MESSAGE data = " + data); events.Enqueue(data); if (events.Count > 1) { _manualResetEvent.Set(); } }); socket.Open(); _manualResetEvent.WaitOne(); socket.Close(); string result; result = events.Dequeue(); Assert.Equal("hi", result); result = events.Dequeue(); Assert.Equal("got cookie", result); } //Fails in .netstandard1.3 for EngineIoClientDotNet 1.0.4 [Fact] public void UpgradeCookie() { _manualResetEvent = new ManualResetEvent(false); var events = new Queue(); var options = CreateOptions(); options.Cookies.Add("foo", "bar"); var socket = new Socket(options); socket.On(Socket.EVENT_UPGRADING, (data) => { //log.Info(Socket.EVENT_UPGRADING + string.Format(" data = {0}", data)); events.Enqueue(data); }); socket.On(Socket.EVENT_UPGRADE, (data) => { //log.Info(Socket.EVENT_UPGRADE + string.Format(" data = {0}", data)); events.Enqueue(data); socket.Send("cookie"); }); socket.On(Socket.EVENT_MESSAGE, (d) => { if (events.Count > 1) { var data = (string)d; //log.Info("EVENT_MESSAGE data = " + data); events.Enqueue(data); _manualResetEvent.Set(); } }); socket.Open(); _manualResetEvent.WaitOne(); object test = null; test = events.Dequeue(); Assert.NotNull(test); Assert.IsAssignableFrom(test); test = events.Dequeue(); Assert.NotNull(test); Assert.IsAssignableFrom(test); test = events.Dequeue(); Assert.Equal("got cookie", test); } //[Fact] //public void PrimusEndpoint() //{ // var log = LogManager.GetLogger(System.Reflection.MethodBase.GetCurrentMethod()); // //log.Info("Start"); // _manualResetEvent = new ManualResetEvent(false); // var events = new Queue(); // var options = CreateOptions(); // options.Cookies.Add("foo", "bar"); // options.Hostname = "testme.quobject.com/"; // options.Path = "primus"; // var socket = new Socket(options); // //var socket = new Socket("testme.quobject.com"); // socket.On(Socket.EVENT_OPEN, () => // { // //log.Info("EVENT_OPEN"); // socket.Send("cookie"); // }); // socket.On(Socket.EVENT_MESSAGE, (d) => // { // var data = (string)d; // //log.Info("EVENT_MESSAGE data = " + data); // events.Enqueue(data); // if (events.Count > 1) // { // _manualResetEvent.Set(); // } // }); // socket.Open(); // _manualResetEvent.WaitOne(); // socket.Close(); // string result; // result = events.Dequeue(); // Assert.Equal("hi", result); // result = events.Dequeue(); // Assert.Equal("got cookie", result); //} // [Fact] //public void MessagesMulti() //{ // //logManager.Enabled = true; // var log = LogManager.GetLogger(System.Reflection.MethodBase.GetCurrentMethod()); // //log.Info("Start"); // _manualResetEvent = new ManualResetEvent(false); // var events = new ConcurrentQueue(); // int count = 200; // var socket = new Socket(CreateOptions()); // socket.On(Socket.EVENT_OPEN, () => // { // //log.Info("EVENT_OPEN"); // Task.Run(() => // { // for (int i = 0; i < count; i++) // { // socket.Send("multi"); // Task.Delay(TimeSpan.FromSeconds(1)).Wait(); // } // }); // }); // socket.On(Socket.EVENT_MESSAGE, (d) => // { // var data = (string)d; // //log.Info("EVENT_MESSAGE data = " + data); // events.Enqueue(data); // if (events.Count > count) // { // _manualResetEvent.Set(); // } // }); // socket.Open(); // _manualResetEvent.WaitOne(); // socket.Close(); // string result; // events.TryDequeue(out result); // Assert.Equal("hi", result); // events.TryDequeue(out result); // Assert.Equal("multi", result); //} } }