public async Task SimpleTest()
    {
        var random = new Random();

        var(clientSocket, serverSocket) = SocketHelper.GetSocketPair();

        await using 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 connectTask = clientMultiplexer.ConnectAsync().AsTask();
        var acceptTask  = serverMultiplexer.AcceptAsync().AsTask();

        await TestHelper.RandomSendAndReceive(random, connectTask.Result, acceptTask.Result);

        await TestHelper.RandomSendAndReceive(random, acceptTask.Result, connectTask.Result);
    }
Exemple #2
0
    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();
    }
Exemple #3
0
    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");
        }
    }