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(); } } } }