Files
AIC-Project/Server/Gateway.Tests/SessionManagerTests.cs
T
2026-07-10 10:24:29 +08:00

74 lines
2.3 KiB
C#

using Xunit;
using XWorld.Server.Gateway;
namespace XWorld.Server.Gateway.Tests
{
public class SessionManagerTests
{
[Fact]
public void Connect_NewPid_CreatesConnectedSession()
{
var sm = new SessionManager();
var c = new FakeConnection(1);
sm.OnConnect(1, c);
Assert.True(sm.IsConnected(1));
Assert.Same(c, sm.GetConnection(1));
}
[Fact]
public void Reconnect_SamePid_RebindsToNewConnection()
{
var sm = new SessionManager();
var c1 = new FakeConnection(1);
var c2 = new FakeConnection(1);
sm.OnConnect(1, c1);
sm.OnDisconnect(1, c1, currentTick: 5);
Assert.False(sm.IsConnected(1));
Assert.Null(sm.GetConnection(1));
sm.OnConnect(1, c2); // 重连
Assert.True(sm.IsConnected(1));
Assert.Same(c2, sm.GetConnection(1)); // 路由到新连接
}
[Fact]
public void StaleDisconnect_AfterReconnect_DoesNotClobber()
{
var sm = new SessionManager();
var c1 = new FakeConnection(1);
var c2 = new FakeConnection(1);
sm.OnConnect(1, c1);
sm.OnConnect(1, c2); // 已重连到 c2
sm.OnDisconnect(1, c1, currentTick: 9); // 旧连接 c1 的迟到断线不应清掉 c2
Assert.True(sm.IsConnected(1));
Assert.Same(c2, sm.GetConnection(1));
}
[Fact]
public void RoomBinding_RoundTrips()
{
var sm = new SessionManager();
sm.OnConnect(1, new FakeConnection(1));
sm.Get(1).RoomId = "r1";
Assert.Equal("r1", sm.Get(1).RoomId);
}
[Fact]
public void SweepExpired_RemovesSessionsPastWindow()
{
var sm = new SessionManager();
var conn = new FakeConnection(1);
sm.OnConnect(1, conn);
sm.OnDisconnect(1, conn, currentTick: 0);
var none = sm.SweepExpired(currentTick: 3, windowTicks: 5);
Assert.Empty(none);
Assert.NotNull(sm.Get(1));
var removed = sm.SweepExpired(currentTick: 6, windowTicks: 5); // 6-0 > 5
Assert.Single(removed);
Assert.Null(sm.Get(1));
}
}
}