PPAP integration

This commit is contained in:
2026-07-16 19:36:30 +03:00
parent ba64a0c95a
commit 4cd9f928ff
36 changed files with 6586 additions and 656 deletions
+97
View File
@@ -49,6 +49,103 @@ public class PeerConnectionLimitTests
replacementSocket.Close();
}
[Fact]
public void Server_RejectsRepeatedConnectionsAbovePerIpAttemptRate()
{
var warehouse = new Warehouse();
warehouse.Configuration.Connections.MaximumConnectionsPerIpAddress = 0;
warehouse.Configuration.Connections.MaximumConnectionAttemptsPerIpAddress = 2;
warehouse.Configuration.Connections.ConnectionAttemptWindow = TimeSpan.FromMinutes(1);
var server = new EpServer();
server.Instance = new Instance(warehouse, 1, "server", server, null);
server.Connections = new AutoList<EpConnection, NetworkServer<EpConnection>>(server);
var address = IPAddress.Parse("192.0.2.20");
for (var index = 0; index < 2; index++)
{
var admittedSocket = new TestSocket(address, 11000 + index);
var admitted = new EpConnection();
admitted.Assign(admittedSocket);
server.Add(admitted);
Assert.Equal(SocketState.Established, admittedSocket.State);
admittedSocket.Close();
}
var rejectedSocket = new TestSocket(address, 11002);
var rejected = new EpConnection();
rejected.Assign(rejectedSocket);
server.Add(rejected);
Assert.Equal(SocketState.Closed, rejectedSocket.State);
Assert.Empty(server.Connections);
var otherSocket = new TestSocket(IPAddress.Parse("192.0.2.21"), 11003);
var other = new EpConnection();
other.Assign(otherSocket);
server.Add(other);
Assert.Equal(SocketState.Established, otherSocket.State);
otherSocket.Close();
}
[Fact]
public async Task Server_ClosesStalledAuthenticationAtDeadlineAndReleasesSlot()
{
var warehouse = new Warehouse();
warehouse.Configuration.Connections.MaximumConnectionsPerIpAddress = 1;
var server = new EpServer
{
AuthenticationTimeout = TimeSpan.FromMilliseconds(50),
};
server.Instance = new Instance(warehouse, 1, "server", server, null);
server.Connections = new AutoList<EpConnection, NetworkServer<EpConnection>>(server);
var address = IPAddress.Parse("192.0.2.30");
var socket = new TestSocket(address, 12000);
var connection = new EpConnection();
connection.Assign(socket);
server.Add(connection);
var deadline = DateTime.UtcNow + TimeSpan.FromSeconds(3);
while ((socket.State != SocketState.Closed
|| server.GetConnectionCount(address) != 0
|| server.Connections.Count != 0)
&& DateTime.UtcNow < deadline)
await Task.Delay(10);
Assert.Equal(SocketState.Closed, socket.State);
Assert.Equal(0, server.GetConnectionCount(address));
Assert.Empty(server.Connections);
Assert.False(connection.Session.Authenticated);
}
[Fact]
public async Task Client_ClosesStalledAuthenticationAtDeadline()
{
var socket = new TestSocket(IPAddress.Parse("192.0.2.40"), 13000);
var connection = new EpConnection
{
AuthenticationTimeout = TimeSpan.FromMilliseconds(50),
};
var warehouse = new Warehouse();
connection.Instance = new Instance(
warehouse,
1,
"example.test",
connection,
null);
_ = connection.Connect(socket, "example.test", 10518, "example.test");
var deadline = DateTime.UtcNow + TimeSpan.FromSeconds(3);
while (socket.State != SocketState.Closed && DateTime.UtcNow < deadline)
await Task.Delay(10);
Assert.Equal(SocketState.Closed, socket.State);
Assert.False(connection.Session.Authenticated);
Assert.Equal(EpConnectionStatus.Closed, connection.Status);
}
sealed class TestSocket : ISocket
{
public event DestroyedEvent? OnDestroy;