54 lines
2.0 KiB
C#
54 lines
2.0 KiB
C#
using System.Net;
|
|
using System.Net.Sockets;
|
|
using System.Threading.Tasks;
|
|
using Xunit;
|
|
using XWorld.Framework.Protocol;
|
|
using XWorld.Server.Gateway;
|
|
|
|
namespace XWorld.Server.Gateway.Tests
|
|
{
|
|
public class GameServerHostDiscoveryTests
|
|
{
|
|
[Fact]
|
|
public async Task HostWithoutToken_NoResponder()
|
|
{
|
|
var host = new GameServerHost();
|
|
await host.StartAsync(TestGames.Root, tickIntervalMs: 50);
|
|
try { Assert.Equal(0, host.DevDiscoveryPort); }
|
|
finally { await host.StopAsync(); }
|
|
}
|
|
|
|
[Fact]
|
|
public async Task HostWithToken_AnswersDiscovery_AdvertisesWsAndCdn()
|
|
{
|
|
var host = new GameServerHost();
|
|
await host.StartAsync(TestGames.Root, tickIntervalMs: 50,
|
|
devDiscoveryToken: "secret",
|
|
advertiseResourceBaseUrl: "http://192.168.1.50:15081/minigame/",
|
|
devDiscoveryPort: 0);
|
|
try
|
|
{
|
|
Assert.NotEqual(0, host.DevDiscoveryPort);
|
|
|
|
using var client = new UdpClient(AddressFamily.InterNetwork);
|
|
byte[] q = DevDiscoveryCodec.EncodeQuery(new DevDiscoveryQuery
|
|
{
|
|
ProtoVersion = DevDiscovery.ProtoVersion,
|
|
Nonce = 3,
|
|
Token = "secret",
|
|
});
|
|
await client.SendAsync(q, q.Length, new IPEndPoint(IPAddress.Loopback, host.DevDiscoveryPort));
|
|
|
|
var recv = client.ReceiveAsync();
|
|
var done = await Task.WhenAny(recv, Task.Delay(2000));
|
|
Assert.Same(recv, done);
|
|
UdpReceiveResult result = await recv;
|
|
Assert.True(DevDiscoveryCodec.TryDecodeReply(result.Buffer, out var reply));
|
|
Assert.Equal(host.WsBaseUrl + "/ws", reply.GatewayUrl);
|
|
Assert.Equal("http://192.168.1.50:15081/minigame/", reply.ResourceBaseUrl);
|
|
}
|
|
finally { await host.StopAsync(); }
|
|
}
|
|
}
|
|
}
|