using System.Net; using System.Net.Sockets; using System.Text; namespace Nonemm.Keying.Tests; /// The sender is tested against a socket that speaks cwdaemon's side of the /// protocol, so what goes on the wire is what is asserted. public class CwDaemonSenderTests : IDisposable { private readonly UdpClient daemon = new(new IPEndPoint(IPAddress.Loopback, 0)); private int Port => ((IPEndPoint)daemon.Client.LocalEndPoint!).Port; public void Dispose() { daemon.Dispose(); GC.SuppressFinalize(this); } private async Task NextDatagram(Func send) { Task receiving = daemon.ReceiveAsync(); await send(); UdpReceiveResult received = await receiving.WaitAsync(TimeSpan.FromSeconds(5)); return received.Buffer; } [Fact] public async Task TextGoesOutInUpperCase() { using CwDaemonSender sender = new("127.0.0.1", Port); byte[] sent = await NextDatagram(() => sender.SendAsync("cq test de dl1abc")); Assert.Equal("CQ TEST DE DL1ABC", Encoding.ASCII.GetString(sent)); } [Fact] public async Task AbortIsTheEscapeFourCommand() { using CwDaemonSender sender = new("127.0.0.1", Port); byte[] sent = await NextDatagram(() => sender.AbortAsync()); Assert.Equal([0x1B, (byte)'4'], sent); } [Fact] public async Task SpeedIsTheEscapeTwoCommand() { using CwDaemonSender sender = new("127.0.0.1", Port); byte[] sent = await NextDatagram(() => sender.SetSpeedAsync(32)); Assert.Equal([0x1B, (byte)'2', (byte)'3', (byte)'2'], sent); } }