public async Task SimpleFunctionTest() { var(clientSocket, serverSocket) = SocketHelper.GetSocketPair(); var bytesPool = BytesPool.Shared; var batchActionDispatcher = new BatchActionDispatcher(TimeSpan.FromMilliseconds(10)); var bridgeConnectionOptions = new BridgeConnectionOptions(1024 * 1024 * 256); await using var clientBridgeConnection = new BridgeConnection(new SocketCap(clientSocket), null, null, batchActionDispatcher, BytesPool.Shared, bridgeConnectionOptions); await using var serverBridgeConnection = new BridgeConnection(new SocketCap(serverSocket), null, null, batchActionDispatcher, BytesPool.Shared, bridgeConnectionOptions); var clientMultiplexerOption = new OmniConnectionMultiplexerOptions(OmniConnectionMultiplexerType.Connected, TimeSpan.FromMinutes(1), 3, 1024 * 1024 * 256, 3); await using var clientMultiplexer = OmniConnectionMultiplexer.CreateV1(clientBridgeConnection, batchActionDispatcher, BytesPool.Shared, clientMultiplexerOption); var serverMultiplexerOption = new OmniConnectionMultiplexerOptions(OmniConnectionMultiplexerType.Accepted, TimeSpan.FromMinutes(1), 3, 1024 * 1024 * 256, 3); await using var serverMultiplexer = OmniConnectionMultiplexer.CreateV1(serverBridgeConnection, batchActionDispatcher, BytesPool.Shared, serverMultiplexerOption); var clientMultiplexerHandshakeTask = clientMultiplexer.HandshakeAsync().AsTask(); var serverMultiplexerHandshakeTask = serverMultiplexer.HandshakeAsync().AsTask(); await Task.WhenAll(clientMultiplexerHandshakeTask, serverMultiplexerHandshakeTask); var mockTestService = new Mock <ITestService>(); mockTestService.Setup(n => n.Unary1Async(It.IsAny <TestParam>(), It.IsAny <CancellationToken>())).Returns(new ValueTask <TestResult>(new TestResult(1))); var remotingConnector = new RocketRemotingCallerFactory <DefaultErrorMessage>(clientMultiplexer, bytesPool); var remotingAccepter = new RocketRemotingListenerFactory <DefaultErrorMessage>(serverMultiplexer, DefaultErrorMessageFactory.Default, bytesPool); var client = new TestServiceRemoting.Client <DefaultErrorMessage>(remotingConnector, bytesPool); var server = new TestServiceRemoting.Server <DefaultErrorMessage>(mockTestService.Object, remotingAccepter, bytesPool); var cancellationTokenSource = new CancellationTokenSource(); var eventLoop = server.EventLoopAsync(cancellationTokenSource.Token); var testResult1 = await client.Unary1Async(new TestParam(1), default); mockTestService.Verify(n => n.Unary1Async(new TestParam(1), default), Times.AtMostOnce()); cancellationTokenSource.Cancel(); await Assert.ThrowsAsync <TaskCanceledException>(async() => await eventLoop); cancellationTokenSource.Dispose(); }
private static async Task InternalEventLoopAsync(AxisService service, Socket socket, CancellationToken cancellationToken = default) { using var socketCap = new SocketCap(socket); var bytesPool = BytesPool.Shared; await using var batchActionDispatcher = new BatchActionDispatcher(TimeSpan.FromMilliseconds(10)); var bridgeConnectionOptions = new BridgeConnectionOptions(int.MaxValue); await using var bridgeConnection = new BridgeConnection(socketCap, null, null, batchActionDispatcher, bytesPool, bridgeConnectionOptions); var multiplexerOption = new OmniConnectionMultiplexerOptions(OmniConnectionMultiplexerType.Accepted, TimeSpan.FromMinutes(1), 3, 1024 * 1024 * 4, 3); await using var multiplexer = OmniConnectionMultiplexer.CreateV1(bridgeConnection, batchActionDispatcher, bytesPool, multiplexerOption); await multiplexer.HandshakeAsync(cancellationToken); var errorMessageFactory = new DefaultErrorMessageFactory(); var listenerFactory = new RocketRemotingListenerFactory <DefaultErrorMessage>(multiplexer, errorMessageFactory, bytesPool); try { _logger.Debug("InternalEventLoopAsync: Start"); var server = new AxisServiceRemoting.Server <DefaultErrorMessage>(service, listenerFactory, bytesPool); var linkedCancellationTokenSource = CancellationTokenSource.CreateLinkedTokenSource(cancellationToken); using var onCloseListener = bridgeConnection.Events.OnClosed.Listen(() => linkedCancellationTokenSource.Cancel()); await server.EventLoopAsync(linkedCancellationTokenSource.Token); } catch (Exception e) { _logger.Error(e); } finally { _logger.Debug("InternalEventLoopAsync: End"); } }