public async Task TestReconnectServerGone(string uri) { var factory = Constants.NngFactory; using var client = Lms.CreateClient(factory, uri); using var cts = new CancellationTokenSource(TimeSpan.FromSeconds(2)); await Task.WhenAll( Task.Run(async() => { while (!cts.IsCancellationRequested) { using var ctsServer = CancellationTokenSource.CreateLinkedTokenSource(cts.Token); ctsServer.CancelAfter(TimeSpan.FromMilliseconds(200)); using var server = Lms.CreateServerBuilder() .AddFunction("Foo", (a, b) => default(ValueTask <byte[]>)) .Build(factory, uri); try { await server.Listen(1, ctsServer.Token); }catch (OperationCanceledException) {} } }, cts.Token), Task.Run(async() => { while (!cts.IsCancellationRequested) { try { await client.Request("Foo", null, cts.Token); }catch (OperationCanceledException) {} } }, cts.Token) ); }
static async Task Main(string[] args) { var uri = "ipc://tester"; var path = Path.GetDirectoryName(typeof(Program).Assembly.Location); var ctx = new NngLoadContext(path); var factory = NngLoadContext.Init(ctx); using var cts = new CancellationTokenSource(8000); await Task.WhenAll( // Set up server interface Task.Run(async() => { await using var server = Lms.CreateServerBuilder() .AddFunction <int, int>("Tester", Tester) .AddFunction <int, int>("ThrowException", ThrowException) .Build(factory, uri, null, loggerFactory.CreateLogger <IServer>()); await server.Listen(8, cts.Token); }), // Client Tester request loop Task.Run(async() => { await using var client = Lms.CreateClient(factory, uri, null, loggerFactory.CreateLogger <IClient>()); var random = new Random(); while (!cts.Token.IsCancellationRequested) { var request = random.Next(); var result = await client.Request <int, int>("Tester", request, cts.Token); logger.LogInformation("Requested {Request} and got {Result}", request, result); } }), // Client Tester request loop Task.Run(async() => { await using var client = Lms.CreateClient(factory, uri, null, loggerFactory.CreateLogger <IClient>()); while (!cts.Token.IsCancellationRequested) { try { var result = await client.Request <int, int>("ThrowException", 20, cts.Token); }catch (Exception e) { logger.LogInformation("Called ThrowException and got a {Type} saying {Message}\n{StackTrace}", e.GetType(), e.Message, e.StackTrace); } } }) ); }
public async Task TestProtocols(string uri) { var factory = Constants.NngFactory; using var server = Lms.CreateServerBuilder() .AddFunction("Foo", (a, b) => default(ValueTask <byte[]>)) .Build(factory, uri); using var client = Lms.CreateClient(factory, uri); using var cts = new CancellationTokenSource(); Task listenTask = null; try { listenTask = server.Listen(1, cts.Token); await client.Request("Foo", null); }finally{ cts.Cancel(); await listenTask; } }
public async Task TestLargeObject(string uri) { var factory = Constants.NngFactory; using var server = Lms.CreateServerBuilder() .AddFunction <int>("Foo", LargeObject) .Build(factory, uri); using var client = Lms.CreateClient(factory, uri); using var cts = new CancellationTokenSource(); Task listenTask = null; try { listenTask = server.Listen(1, cts.Token); var r = new Random(); var s = 1024 * 1024 * 2 + r.Next(12, 345); var b = await client.Request("Foo", s); Assert.Equal(s, b.Length); }finally{ cts.Cancel(); await listenTask; } }
public async Task TestRemoteException(string uri) { var factory = Constants.NngFactory; using var server = Lms.CreateServerBuilder() .AddFunction <string>("Throw", ThrowException) .Build(factory, uri); using var client = Lms.CreateClient(factory, uri); using var cts = new CancellationTokenSource(); Task listenTask = null; try { listenTask = server.Listen(1, cts.Token); var exception = await Assert.ThrowsAsync <RemoteException>(async() => await client.Request("Throw", "Foo Bar")); Assert.Equal("lms.test", exception.Source); Assert.Equal("Foo Bar", exception.Message); Assert.Contains($"at {typeof(ExceptionTests).FullName}.{nameof(ThrowException)}(String message, CancellationToken cancellationToken)", exception.StackTrace); }finally{ cts.Cancel(); await listenTask; } }