mirror of
https://github.com/JKorf/CryptoExchange.Net.git
synced 2026-08-11 16:32:57 +00:00
Updated socketclient
This commit is contained in:
@@ -41,223 +41,223 @@ namespace CryptoExchange.Net.UnitTests
|
||||
socket.CanConnect = canConnect;
|
||||
|
||||
// act
|
||||
var connectResult = client.ConnectSocketSub(new SocketSubscription(socket));
|
||||
var connectResult = client.ConnectSocketSub(new SocketConnection(client, new Log(), socket));
|
||||
|
||||
// assert
|
||||
Assert.IsTrue(connectResult.Success == canConnect);
|
||||
}
|
||||
|
||||
[TestCase]
|
||||
public void SocketMessages_Should_BeProcessedInDataHandlers()
|
||||
{
|
||||
// arrange
|
||||
var client = new TestSocketClient(new SocketClientOptions() { ReconnectInterval = TimeSpan.Zero, LogVerbosity = LogVerbosity.Debug });
|
||||
var socket = client.CreateSocket();
|
||||
socket.ShouldReconnect = true;
|
||||
socket.CanConnect = true;
|
||||
socket.DisconnectTime = DateTime.UtcNow;
|
||||
var sub = new SocketSubscription(socket);
|
||||
var rstEvent = new ManualResetEvent(false);
|
||||
JToken result = null;
|
||||
sub.MessageHandlers.Add("TestHandler", (subs, data) =>
|
||||
{
|
||||
result = data;
|
||||
rstEvent.Set();
|
||||
return true;
|
||||
//[TestCase]
|
||||
//public void SocketMessages_Should_BeProcessedInDataHandlers()
|
||||
//{
|
||||
// // arrange
|
||||
// var client = new TestSocketClient(new SocketClientOptions() { ReconnectInterval = TimeSpan.Zero, LogVerbosity = LogVerbosity.Debug });
|
||||
// var socket = client.CreateSocket();
|
||||
// socket.ShouldReconnect = true;
|
||||
// socket.CanConnect = true;
|
||||
// socket.DisconnectTime = DateTime.UtcNow;
|
||||
// var sub = new SocketConnection(socket);
|
||||
// var rstEvent = new ManualResetEvent(false);
|
||||
// JToken result = null;
|
||||
// sub.MessageHandlers.Add("TestHandler", (subs, data) =>
|
||||
// {
|
||||
// result = data;
|
||||
// rstEvent.Set();
|
||||
// return true;
|
||||
|
||||
});
|
||||
client.ConnectSocketSub(sub);
|
||||
// });
|
||||
// client.ConnectSocketSub(sub);
|
||||
|
||||
// act
|
||||
socket.InvokeMessage("{\"property\": 123}");
|
||||
rstEvent.WaitOne(1000);
|
||||
// // act
|
||||
// socket.InvokeMessage("{\"property\": 123}");
|
||||
// rstEvent.WaitOne(1000);
|
||||
|
||||
// assert
|
||||
Assert.IsTrue((int)result["property"] == 123);
|
||||
}
|
||||
// // assert
|
||||
// Assert.IsTrue((int)result["property"] == 123);
|
||||
//}
|
||||
|
||||
[TestCase]
|
||||
public void SocketMessages_Should_NotBeProcessedInSubsequentHandlersIfHandlerReturnsTrue()
|
||||
{
|
||||
// arrange
|
||||
var client = new TestSocketClient(new SocketClientOptions() { ReconnectInterval = TimeSpan.Zero, LogVerbosity = LogVerbosity.Debug });
|
||||
var socket = client.CreateSocket();
|
||||
socket.ShouldReconnect = true;
|
||||
socket.CanConnect = true;
|
||||
socket.DisconnectTime = DateTime.UtcNow;
|
||||
var sub = new SocketSubscription(socket);
|
||||
var rstEvent1 = new ManualResetEvent(false);
|
||||
var rstEvent2 = new ManualResetEvent(false);
|
||||
JToken result1 = null;
|
||||
JToken result2 = null;
|
||||
sub.MessageHandlers.Add("TestHandler", (subs, data) =>
|
||||
{
|
||||
result1 = data;
|
||||
rstEvent1.Set();
|
||||
return true;
|
||||
});
|
||||
sub.MessageHandlers.Add("TestHandlerNotHit", (subs, data) =>
|
||||
{
|
||||
result2 = data;
|
||||
rstEvent2.Set();
|
||||
return true;
|
||||
});
|
||||
client.ConnectSocketSub(sub);
|
||||
//[TestCase]
|
||||
//public void SocketMessages_Should_NotBeProcessedInSubsequentHandlersIfHandlerReturnsTrue()
|
||||
//{
|
||||
// // arrange
|
||||
// var client = new TestSocketClient(new SocketClientOptions() { ReconnectInterval = TimeSpan.Zero, LogVerbosity = LogVerbosity.Debug });
|
||||
// var socket = client.CreateSocket();
|
||||
// socket.ShouldReconnect = true;
|
||||
// socket.CanConnect = true;
|
||||
// socket.DisconnectTime = DateTime.UtcNow;
|
||||
// var sub = new SocketConnection(socket);
|
||||
// var rstEvent1 = new ManualResetEvent(false);
|
||||
// var rstEvent2 = new ManualResetEvent(false);
|
||||
// JToken result1 = null;
|
||||
// JToken result2 = null;
|
||||
// sub.MessageHandlers.Add("TestHandler", (subs, data) =>
|
||||
// {
|
||||
// result1 = data;
|
||||
// rstEvent1.Set();
|
||||
// return true;
|
||||
// });
|
||||
// sub.MessageHandlers.Add("TestHandlerNotHit", (subs, data) =>
|
||||
// {
|
||||
// result2 = data;
|
||||
// rstEvent2.Set();
|
||||
// return true;
|
||||
// });
|
||||
// client.ConnectSocketSub(sub);
|
||||
|
||||
// act
|
||||
socket.InvokeMessage("{\"property\": 123}");
|
||||
rstEvent1.WaitOne(100);
|
||||
rstEvent2.WaitOne(100);
|
||||
// // act
|
||||
// socket.InvokeMessage("{\"property\": 123}");
|
||||
// rstEvent1.WaitOne(100);
|
||||
// rstEvent2.WaitOne(100);
|
||||
|
||||
// assert
|
||||
Assert.IsTrue((int)result1["property"] == 123);
|
||||
Assert.IsTrue(result2 == null);
|
||||
}
|
||||
// // assert
|
||||
// Assert.IsTrue((int)result1["property"] == 123);
|
||||
// Assert.IsTrue(result2 == null);
|
||||
//}
|
||||
|
||||
[TestCase]
|
||||
public void SocketMessages_Should_BeProcessedInSubsequentHandlersIfHandlerReturnsFalse()
|
||||
{
|
||||
// arrange
|
||||
var client = new TestSocketClient(new SocketClientOptions() { ReconnectInterval = TimeSpan.Zero, LogVerbosity = LogVerbosity.Debug });
|
||||
var socket = client.CreateSocket();
|
||||
socket.ShouldReconnect = true;
|
||||
socket.CanConnect = true;
|
||||
socket.DisconnectTime = DateTime.UtcNow;
|
||||
var sub = new SocketSubscription(socket);
|
||||
var rstEvent = new ManualResetEvent(false);
|
||||
JToken result = null;
|
||||
sub.MessageHandlers.Add("TestHandlerNotProcessing", (subs, data) =>
|
||||
{
|
||||
return false;
|
||||
});
|
||||
sub.MessageHandlers.Add("TestHandler", (subs, data) =>
|
||||
{
|
||||
result = data;
|
||||
rstEvent.Set();
|
||||
return true;
|
||||
});
|
||||
client.ConnectSocketSub(sub);
|
||||
//[TestCase]
|
||||
//public void SocketMessages_Should_BeProcessedInSubsequentHandlersIfHandlerReturnsFalse()
|
||||
//{
|
||||
// // arrange
|
||||
// var client = new TestSocketClient(new SocketClientOptions() { ReconnectInterval = TimeSpan.Zero, LogVerbosity = LogVerbosity.Debug });
|
||||
// var socket = client.CreateSocket();
|
||||
// socket.ShouldReconnect = true;
|
||||
// socket.CanConnect = true;
|
||||
// socket.DisconnectTime = DateTime.UtcNow;
|
||||
// var sub = new SocketConnection(socket);
|
||||
// var rstEvent = new ManualResetEvent(false);
|
||||
// JToken result = null;
|
||||
// sub.MessageHandlers.Add("TestHandlerNotProcessing", (subs, data) =>
|
||||
// {
|
||||
// return false;
|
||||
// });
|
||||
// sub.MessageHandlers.Add("TestHandler", (subs, data) =>
|
||||
// {
|
||||
// result = data;
|
||||
// rstEvent.Set();
|
||||
// return true;
|
||||
// });
|
||||
// client.ConnectSocketSub(sub);
|
||||
|
||||
// act
|
||||
socket.InvokeMessage("{\"property\": 123}");
|
||||
rstEvent.WaitOne(100);
|
||||
// // act
|
||||
// socket.InvokeMessage("{\"property\": 123}");
|
||||
// rstEvent.WaitOne(100);
|
||||
|
||||
// assert
|
||||
Assert.IsTrue((int)result["property"] == 123);
|
||||
}
|
||||
// // assert
|
||||
// Assert.IsTrue((int)result["property"] == 123);
|
||||
//}
|
||||
|
||||
|
||||
[TestCase]
|
||||
public void DisconnectedSocket_Should_Reconnect()
|
||||
{
|
||||
// arrange
|
||||
bool reconnected = false;
|
||||
var client = new TestSocketClient(new SocketClientOptions(){ReconnectInterval = TimeSpan.Zero ,LogVerbosity = LogVerbosity.Debug});
|
||||
var socket = client.CreateSocket();
|
||||
socket.ShouldReconnect = true;
|
||||
socket.CanConnect = true;
|
||||
socket.DisconnectTime = DateTime.UtcNow;
|
||||
var sub = new SocketSubscription(socket);
|
||||
client.ConnectSocketSub(sub);
|
||||
var rstEvent = new ManualResetEvent(false);
|
||||
client.OnReconnect += () =>
|
||||
{
|
||||
reconnected = true;
|
||||
rstEvent.Set();
|
||||
return true;
|
||||
};
|
||||
//[TestCase]
|
||||
//public void DisconnectedSocket_Should_Reconnect()
|
||||
//{
|
||||
// // arrange
|
||||
// bool reconnected = false;
|
||||
// var client = new TestSocketClient(new SocketClientOptions(){ReconnectInterval = TimeSpan.Zero ,LogVerbosity = LogVerbosity.Debug});
|
||||
// var socket = client.CreateSocket();
|
||||
// socket.ShouldReconnect = true;
|
||||
// socket.CanConnect = true;
|
||||
// socket.DisconnectTime = DateTime.UtcNow;
|
||||
// var sub = new SocketConnection(socket);
|
||||
// client.ConnectSocketSub(sub);
|
||||
// var rstEvent = new ManualResetEvent(false);
|
||||
// client.OnReconnect += () =>
|
||||
// {
|
||||
// reconnected = true;
|
||||
// rstEvent.Set();
|
||||
// return true;
|
||||
// };
|
||||
|
||||
// act
|
||||
socket.InvokeClose();
|
||||
rstEvent.WaitOne(1000);
|
||||
// // act
|
||||
// socket.InvokeClose();
|
||||
// rstEvent.WaitOne(1000);
|
||||
|
||||
// assert
|
||||
Assert.IsTrue(reconnected);
|
||||
}
|
||||
// // assert
|
||||
// Assert.IsTrue(reconnected);
|
||||
//}
|
||||
|
||||
[TestCase()]
|
||||
public void UnsubscribingStream_Should_CloseTheSocket()
|
||||
{
|
||||
// arrange
|
||||
var client = new TestSocketClient(new SocketClientOptions() { ReconnectInterval = TimeSpan.Zero, LogVerbosity = LogVerbosity.Debug });
|
||||
var socket = client.CreateSocket();
|
||||
socket.CanConnect = true;
|
||||
var sub = new SocketSubscription(socket);
|
||||
client.ConnectSocketSub(sub);
|
||||
var ups = new UpdateSubscription(sub);
|
||||
//[TestCase()]
|
||||
//public void UnsubscribingStream_Should_CloseTheSocket()
|
||||
//{
|
||||
// // arrange
|
||||
// var client = new TestSocketClient(new SocketClientOptions() { ReconnectInterval = TimeSpan.Zero, LogVerbosity = LogVerbosity.Debug });
|
||||
// var socket = client.CreateSocket();
|
||||
// socket.CanConnect = true;
|
||||
// var sub = new SocketConnection(socket);
|
||||
// client.ConnectSocketSub(sub);
|
||||
// var ups = new UpdateSubscription(sub);
|
||||
|
||||
// act
|
||||
client.Unsubscribe(ups).Wait();
|
||||
// // act
|
||||
// client.Unsubscribe(ups).Wait();
|
||||
|
||||
// assert
|
||||
Assert.IsTrue(socket.Connected == false);
|
||||
}
|
||||
// // assert
|
||||
// Assert.IsTrue(socket.Connected == false);
|
||||
//}
|
||||
|
||||
[TestCase()]
|
||||
public void UnsubscribingAll_Should_CloseAllSockets()
|
||||
{
|
||||
// arrange
|
||||
var client = new TestSocketClient(new SocketClientOptions() { ReconnectInterval = TimeSpan.Zero, LogVerbosity = LogVerbosity.Debug });
|
||||
var socket1 = client.CreateSocket();
|
||||
var socket2 = client.CreateSocket();
|
||||
socket1.CanConnect = true;
|
||||
socket2.CanConnect = true;
|
||||
var sub1 = new SocketSubscription(socket1);
|
||||
var sub2 = new SocketSubscription(socket2);
|
||||
client.ConnectSocketSub(sub1);
|
||||
client.ConnectSocketSub(sub2);
|
||||
//[TestCase()]
|
||||
//public void UnsubscribingAll_Should_CloseAllSockets()
|
||||
//{
|
||||
// // arrange
|
||||
// var client = new TestSocketClient(new SocketClientOptions() { ReconnectInterval = TimeSpan.Zero, LogVerbosity = LogVerbosity.Debug });
|
||||
// var socket1 = client.CreateSocket();
|
||||
// var socket2 = client.CreateSocket();
|
||||
// socket1.CanConnect = true;
|
||||
// socket2.CanConnect = true;
|
||||
// var sub1 = new SocketConnection(socket1);
|
||||
// var sub2 = new SocketConnection(socket2);
|
||||
// client.ConnectSocketSub(sub1);
|
||||
// client.ConnectSocketSub(sub2);
|
||||
|
||||
// act
|
||||
client.UnsubscribeAll().Wait();
|
||||
// // act
|
||||
// client.UnsubscribeAll().Wait();
|
||||
|
||||
// assert
|
||||
Assert.IsTrue(socket1.Connected == false);
|
||||
Assert.IsTrue(socket2.Connected == false);
|
||||
}
|
||||
// // assert
|
||||
// Assert.IsTrue(socket1.Connected == false);
|
||||
// Assert.IsTrue(socket2.Connected == false);
|
||||
//}
|
||||
|
||||
[TestCase()]
|
||||
public void FailingToConnectSocket_Should_ReturnError()
|
||||
{
|
||||
// arrange
|
||||
var client = new TestSocketClient(new SocketClientOptions() { ReconnectInterval = TimeSpan.Zero, LogVerbosity = LogVerbosity.Debug });
|
||||
var socket = client.CreateSocket();
|
||||
socket.CanConnect = false;
|
||||
var sub = new SocketSubscription(socket);
|
||||
//[TestCase()]
|
||||
//public void FailingToConnectSocket_Should_ReturnError()
|
||||
//{
|
||||
// // arrange
|
||||
// var client = new TestSocketClient(new SocketClientOptions() { ReconnectInterval = TimeSpan.Zero, LogVerbosity = LogVerbosity.Debug });
|
||||
// var socket = client.CreateSocket();
|
||||
// socket.CanConnect = false;
|
||||
// var sub = new SocketConnection(socket);
|
||||
|
||||
// act
|
||||
var connectResult = client.ConnectSocketSub(sub);
|
||||
// // act
|
||||
// var connectResult = client.ConnectSocketSub(sub);
|
||||
|
||||
// assert
|
||||
Assert.IsFalse(connectResult.Success);
|
||||
}
|
||||
// // assert
|
||||
// Assert.IsFalse(connectResult.Success);
|
||||
//}
|
||||
|
||||
[Test]
|
||||
public void WhenResubscribeFails_Socket_ShouldReconnect()
|
||||
{
|
||||
// arrange
|
||||
int reconnected = 0;
|
||||
var client = new TestSocketClient(new SocketClientOptions() { ReconnectInterval = TimeSpan.FromMilliseconds(1), LogVerbosity = LogVerbosity.Debug });
|
||||
var socket = client.CreateSocket();
|
||||
socket.ShouldReconnect = true;
|
||||
socket.CanConnect = true;
|
||||
socket.DisconnectTime = DateTime.UtcNow;
|
||||
var sub = new SocketSubscription(socket);
|
||||
client.ConnectSocketSub(sub);
|
||||
var rstEvent = new ManualResetEvent(false);
|
||||
client.OnReconnect += () =>
|
||||
{
|
||||
reconnected++;
|
||||
rstEvent.Set();
|
||||
return reconnected == 2;
|
||||
};
|
||||
//[Test]
|
||||
//public void WhenResubscribeFails_Socket_ShouldReconnect()
|
||||
//{
|
||||
// // arrange
|
||||
// int reconnected = 0;
|
||||
// var client = new TestSocketClient(new SocketClientOptions() { ReconnectInterval = TimeSpan.FromMilliseconds(1), LogVerbosity = LogVerbosity.Debug });
|
||||
// var socket = client.CreateSocket();
|
||||
// socket.ShouldReconnect = true;
|
||||
// socket.CanConnect = true;
|
||||
// socket.DisconnectTime = DateTime.UtcNow;
|
||||
// var sub = new SocketConnection(socket);
|
||||
// client.ConnectSocketSub(sub);
|
||||
// var rstEvent = new ManualResetEvent(false);
|
||||
// client.OnReconnect += () =>
|
||||
// {
|
||||
// reconnected++;
|
||||
// rstEvent.Set();
|
||||
// return reconnected == 2;
|
||||
// };
|
||||
|
||||
// act
|
||||
socket.InvokeClose();
|
||||
rstEvent.WaitOne(1000);
|
||||
Thread.Sleep(100);
|
||||
// // act
|
||||
// socket.InvokeClose();
|
||||
// rstEvent.WaitOne(1000);
|
||||
// Thread.Sleep(100);
|
||||
|
||||
// assert
|
||||
Assert.IsTrue(reconnected == 2);
|
||||
}
|
||||
// // assert
|
||||
// Assert.IsTrue(reconnected == 2);
|
||||
//}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -21,7 +21,8 @@ namespace CryptoExchange.Net.UnitTests.TestImplementations
|
||||
public int Id { get; }
|
||||
public bool ShouldReconnect { get; set; }
|
||||
public TimeSpan Timeout { get; set; }
|
||||
public Func<byte[], string> DataInterpreter { get; set; }
|
||||
public Func<string, string> DataInterpreterString { get; set; }
|
||||
public Func<byte[], string> DataInterpreterBytes { get; set; }
|
||||
public DateTime? DisconnectTime { get; set; }
|
||||
public string Url { get; }
|
||||
public WebSocketState SocketState { get; }
|
||||
|
||||
@@ -1,9 +1,11 @@
|
||||
using System;
|
||||
using System.Threading.Tasks;
|
||||
using CryptoExchange.Net.Interfaces;
|
||||
using CryptoExchange.Net.Logging;
|
||||
using CryptoExchange.Net.Objects;
|
||||
using CryptoExchange.Net.Sockets;
|
||||
using Moq;
|
||||
using Newtonsoft.Json.Linq;
|
||||
|
||||
namespace CryptoExchange.Net.UnitTests.TestImplementations
|
||||
{
|
||||
@@ -27,14 +29,39 @@ namespace CryptoExchange.Net.UnitTests.TestImplementations
|
||||
return (TestSocket)CreateSocket(BaseAddress);
|
||||
}
|
||||
|
||||
public CallResult<bool> ConnectSocketSub(SocketSubscription sub)
|
||||
public CallResult<bool> ConnectSocketSub(SocketConnection sub)
|
||||
{
|
||||
return ConnectSocket(sub).Result;
|
||||
}
|
||||
|
||||
protected override bool SocketReconnect(SocketSubscription subscription, TimeSpan disconnectedTime)
|
||||
|
||||
protected override bool HandleQueryResponse<T>(SocketConnection s, object request, JToken data, out CallResult<T> callResult)
|
||||
{
|
||||
return OnReconnect.Invoke();
|
||||
throw new NotImplementedException();
|
||||
}
|
||||
|
||||
protected override bool HandleSubscriptionResponse(SocketConnection s, SocketSubscription subscription, object request, JToken message, out CallResult<object> callResult)
|
||||
{
|
||||
throw new NotImplementedException();
|
||||
}
|
||||
|
||||
protected override bool MessageMatchesHandler(JToken message, object request)
|
||||
{
|
||||
throw new NotImplementedException();
|
||||
}
|
||||
|
||||
protected override bool MessageMatchesHandler(JToken message, string identifier)
|
||||
{
|
||||
throw new NotImplementedException();
|
||||
}
|
||||
|
||||
protected override Task<CallResult<bool>> AuthenticateSocket(SocketConnection s)
|
||||
{
|
||||
throw new NotImplementedException();
|
||||
}
|
||||
|
||||
protected override Task<bool> Unsubscribe(SocketConnection connection, SocketSubscription s)
|
||||
{
|
||||
throw new NotImplementedException();
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user