using System; using System.IO.Pipes; using System.Threading.Tasks; using MxGateway.Contracts; using MxGateway.Contracts.Proto; using MxGateway.Worker.Bootstrap; using MxGateway.Worker.Ipc; namespace MxGateway.Worker.Tests.Ipc; public sealed class WorkerPipeClientTests { [Fact] public async Task RunAsync_ConnectsToPipeAndCompletesHandshake() { string pipeName = $"mxaccess-gateway-test-{Guid.NewGuid():N}"; WorkerOptions workerOptions = new( "session-1", pipeName, GatewayContractInfo.WorkerProtocolVersion, "nonce-secret"); WorkerFrameProtocolOptions frameOptions = new(workerOptions); using NamedPipeServerStream server = new( pipeName, PipeDirection.InOut, 1, PipeTransmissionMode.Byte, PipeOptions.Asynchronous); WorkerPipeClient client = new(connectTimeoutMilliseconds: 5000); Task clientTask = client.RunAsync(workerOptions); await Task.Factory.FromAsync(server.BeginWaitForConnection, server.EndWaitForConnection, null); WorkerFrameReader reader = new(server, frameOptions); WorkerFrameWriter writer = new(server, frameOptions); await writer.WriteAsync(new WorkerEnvelope { ProtocolVersion = GatewayContractInfo.WorkerProtocolVersion, SessionId = "session-1", Sequence = 1, GatewayHello = new GatewayHello { SupportedProtocolVersion = GatewayContractInfo.WorkerProtocolVersion, Nonce = "nonce-secret", GatewayVersion = "test-gateway", }, }); WorkerEnvelope hello = await reader.ReadAsync(); Assert.Equal(WorkerEnvelope.BodyOneofCase.WorkerHello, hello.BodyCase); Assert.Equal("nonce-secret", hello.WorkerHello.Nonce); WorkerEnvelope ready = await reader.ReadAsync(); Assert.Equal(WorkerEnvelope.BodyOneofCase.WorkerReady, ready.BodyCase); await clientTask; } }