public async Task TestServerAbort() { //arrange var server = new WebListenerWebSocketServer(); var port = _FreeTcpPort(); Guid _cid = Guid.Empty; bool _serverDisconnected = false; bool _clientDisconnected = false; var connectedTCS = new TaskCompletionSource <bool>(); var serverDisconnectTCS = new TaskCompletionSource <bool>(); var beh = new testBeh() { ClosedHandler = (h) => { if (h.ConnectionId == _cid) { serverDisconnectTCS.TrySetResult(true); _serverDisconnected = true; } }, ConnectionEstablished = (id, ctx) => { _cid = id; connectedTCS.TrySetResult(true); } }; beh.StringMessageHandler = (e) => { e.WebSocket.SendStringAsync(e.Data + e.Data, CancellationToken.None); }; var u = $"://localhost:{port}/"; server.AddRouteBehavior("/aaa", () => beh); await server.StartAsync("http" + u); var clientDisconnectTCS = new TaskCompletionSource <bool>(); var client = new WebSocketClient() { CloseHandler = (c) => { clientDisconnectTCS.TrySetResult(true); _clientDisconnected = true; } }; await client.ConnectAsync("ws" + u + "aaa"); //act await connectedTCS.Task; server.AbortConnection(_cid); //Assert; await Task.WhenAny(Task.Delay(200), serverDisconnectTCS.Task); Assert.True(_serverDisconnected); await Task.WhenAny(Task.Delay(200), clientDisconnectTCS.Task); Assert.True(_clientDisconnected); var clients = server.GetActiveConnectionIds(); Assert.Empty(clients); server.Dispose(); }
public async Task TestCreateServerClient_connect_2_boot_1() { //arrange var server = new WebListenerWebSocketServer(); var port = _FreeTcpPort(); var beh = new testBeh() { }; beh.StringMessageHandler = (e) => { e.WebSocket.SendStringAsync(e.Data + e.Data, CancellationToken.None); }; server.AddRouteBehavior("/aaa", () => beh); await server.StartAsync($"http://localhost:{port}/"); string res = null; string kickoffRes = null; var oldClient = new WebSocketClient() { MessageHandler = (e) => res = e.Data, CloseHandler = (e) => kickoffRes = e.CloseStatDescription }; await oldClient.ConnectAsync($"ws://localhost:{port}/aaa"); await oldClient.SendStringAsync("hi", CancellationToken.None); await Task.Delay(100); var clients = server.GetActiveConnectionIds(); Guid oldConnectionId = clients.First(); for (int i = 0; i < 100; i++) { var newClient = new WebSocketClient() { MessageHandler = (e) => res = e.Data, CloseHandler = (e) => kickoffRes = e.CloseStatDescription }; await newClient.ConnectAsync($"ws://localhost:{port}/aaa"); await newClient.SendStringAsync("hi", CancellationToken.None); await Task.Delay(100); var newClients = server.GetActiveConnectionIds(); Guid newConnectionId = newClients.Where(id => id != oldConnectionId).First(); Assert.Equal(2, newClients.Count); //Disconnect old client await server.DisconnectConnection(oldConnectionId, "dontlikeu"); await Task.Delay(100); newClients = server.GetActiveConnectionIds(); Assert.Equal(1, newClients.Count); Assert.Equal(newConnectionId, newClients.First()); //Verify that new client still works await newClient.SendStringAsync("hi", CancellationToken.None); //Verify that old client doesn't work try { await oldClient.SendStringAsync("do you like me?", CancellationToken.None); } catch (Exception e) { string message = e.ToString(); } //Verify that new client still works again await newClient.SendStringAsync("hi", CancellationToken.None); while (kickoffRes == null) { await Task.Delay(100); } Assert.Equal("dontlikeu", kickoffRes); Assert.Equal("hihi", res); oldClient = newClient; oldConnectionId = newConnectionId; } }