using System; using System.IO; using System.Net.WebSockets; using System.Security.Authentication; using System.Text; using System.Threading.Tasks; using CryptoExchange.Net.Interfaces; using CryptoExchange.Net.Objects; namespace CryptoExchange.Net.UnitTests.TestImplementations { public class TestSocket: IWebsocket { public bool CanConnect { get; set; } public bool Connected { get; set; } public event Func OnClose; #pragma warning disable 0067 public event Func OnReconnected; public event Func OnReconnecting; public event Func OnRequestRateLimited; #pragma warning restore 0067 public event Func OnRequestSent; public event Func, Task> OnStreamMessage; public event Func OnError; public event Func OnOpen; public Func> GetReconnectionUrl { get; set; } public int Id { get; } public bool ShouldReconnect { get; set; } public TimeSpan Timeout { get; set; } public Func DataInterpreterString { get; set; } public Func DataInterpreterBytes { get; set; } public DateTime? DisconnectTime { get; set; } public string Url { get; } public bool IsClosed => !Connected; public bool IsOpen => Connected; public bool PingConnection { get; set; } public TimeSpan PingInterval { get; set; } public SslProtocols SSLProtocols { get; set; } public Encoding Encoding { get; set; } public int ConnectCalls { get; private set; } public bool Reconnecting { get; set; } public string Origin { get; set; } public int? RatelimitPerSecond { get; set; } public double IncomingKbps => throw new NotImplementedException(); public Uri Uri => new Uri(""); public TimeSpan KeepAliveInterval { get; set; } public static int lastId = 0; public static object lastIdLock = new object(); public TestSocket() { lock (lastIdLock) { Id = lastId + 1; lastId++; } } public Task ConnectAsync() { Connected = CanConnect; ConnectCalls++; if (CanConnect) InvokeOpen(); return Task.FromResult(CanConnect ? new CallResult(null) : new CallResult(new CantConnectError())); } public void Send(int requestId, string data, int weight) { if(!Connected) throw new Exception("Socket not connected"); OnRequestSent?.Invoke(requestId); } public void Reset() { } public Task CloseAsync() { Connected = false; DisconnectTime = DateTime.UtcNow; OnClose?.Invoke(); return Task.FromResult(0); } public void SetProxy(string host, int port) { throw new NotImplementedException(); } public void Dispose() { } public void InvokeClose() { Connected = false; DisconnectTime = DateTime.UtcNow; Reconnecting = true; OnClose?.Invoke(); } public void InvokeOpen() { OnOpen?.Invoke(); } public void InvokeMessage(string data) { OnStreamMessage?.Invoke(WebSocketMessageType.Text, new ReadOnlyMemory(Encoding.UTF8.GetBytes(data))).Wait(); } public void SetProxy(ApiProxy proxy) { throw new NotImplementedException(); } public void InvokeError(Exception error) { OnError?.Invoke(error); } public Task ReconnectAsync() => Task.CompletedTask; } }