示例#1
0
        public void CallServerSideException()
        {
            (var server, var client) = SetupClientServerPair();

            using (server)
                using (client)
                {
                    Assert.IsTrue(client.WhenConnected.Wait(MediumNonDbgTimeout));
                    SpinWait.SpinUntil(() => server.ConnectionCount > 0, MediumNonDbgTimeout);
                    Assert.AreEqual(1, server.ConnectionCount);

                    var mock = new ProvidedCapabilityMock();
                    server.Main = mock;
                    var main = client.GetMain <BareProxy>();
                    Assert.IsTrue(main.WhenResolved.WrappedTask.Wait(MediumNonDbgTimeout));
                    var args = DynamicSerializerState.CreateForRpc();
                    args.SetStruct(1, 0);
                    args.WriteData(0, 123456);
                    using (var answer = main.Call(0x1234567812345678, 0x3333, args))
                    {
                        Assert.IsTrue(mock.WhenCalled.Wait(MediumNonDbgTimeout));
                        (var interfaceId, var methodId, var inargs, var ct) = mock.WhenCalled.Result;
                        Assert.AreEqual <ulong>(0x1234567812345678, interfaceId);
                        Assert.AreEqual <ushort>(0x3333, methodId);
                        Assert.AreEqual(ObjectKind.Struct, inargs.Kind);
                        Assert.AreEqual(123456, inargs.ReadDataInt(0));

                        mock.Return.SetException(new MyTestException());

                        var exTask = Assert.ThrowsExceptionAsync <RpcException>(async() => await answer.WhenReturned);
                        Assert.IsTrue(exTask.Wait(MediumNonDbgTimeout));
                        Assert.IsTrue(exTask.Result.Message.Contains(new MyTestException().Message));
                    }
                }
        }
示例#2
0
        public void PipelineCallDuringDisposal()
        {
            (var server, var client) = SetupClientServerPair();

            using (server)
                using (client)
                {
                    Assert.IsTrue(client.WhenConnected.Wait(MediumNonDbgTimeout));
                    SpinWait.SpinUntil(() => server.ConnectionCount > 0, MediumNonDbgTimeout);
                    Assert.AreEqual(1, server.ConnectionCount);

                    var mock = new ProvidedCapabilityMock();
                    server.Main = mock;
                    var main = client.GetMain <BareProxy>();
                    Assert.IsTrue(main.WhenResolved.WrappedTask.Wait(MediumNonDbgTimeout));
                    var args = DynamicSerializerState.CreateForRpc();
                    args.SetStruct(1, 0);
                    args.WriteData(0, 123456);
                    IPromisedAnswer answer2;
                    using (var answer = main.Call(0x1234567812345678, 0x3333, args))
                    {
                        Assert.IsTrue(mock.WhenCalled.Wait(MediumNonDbgTimeout));

                        var pipelined = (BareProxy)CapabilityReflection.CreateProxy <BareProxy>(answer.Access(new MemberAccessPath(new MemberAccessPath.MemberAccess[] { new MemberAccessPath.StructMemberAccess(1) })));

                        var args2 = DynamicSerializerState.CreateForRpc();
                        args2.SetStruct(1, 0);
                        args2.WriteData(0, 654321);

                        answer2 = pipelined.Call(0x8765432187654321, 0x4444, args2);
                    }

                    using (answer2)
                    {
                        (var interfaceId, var methodId, var inargs, var ct) = mock.WhenCalled.Result;

                        var tcs = new TaskCompletionSource <int>();
                        using (ct.Register(() => tcs.SetResult(0)))
                        {
                            Assert.IsTrue(tcs.Task.Wait(MediumNonDbgTimeout));
                        }

                        var mock2 = new ProvidedCapabilityMock();

                        var result = DynamicSerializerState.CreateForRpc();
                        result.SetStruct(1, 2);
                        result.WriteData(0, 654321);
                        uint id = result.ProvideCapability(mock2).Value;
                        result.LinkToCapability(1, id);

                        mock.Return.SetResult(result);

                        Assert.IsTrue(Assert.ThrowsExceptionAsync <TaskCanceledException>(
                                          async() => await answer2.WhenReturned).Wait(MediumNonDbgTimeout));
                    }
                }
        }
示例#3
0
        public void CallReturnAfterClientSideCancel()
        {
            ExpectingLogOutput       = false;
            (var server, var client) = SetupClientServerPair();

            using (server)
                using (client)
                {
                    try
                    {
                        Assert.IsTrue(client.WhenConnected.Wait(MediumNonDbgTimeout));
                        SpinWait.SpinUntil(() => server.ConnectionCount > 0, MediumNonDbgTimeout);
                        Assert.AreEqual(1, server.ConnectionCount);

                        var mock = new ProvidedCapabilityMock();
                        server.Main = mock;
                        var main = client.GetMain <BareProxy>();
                        Assert.IsTrue(main.WhenResolved.WrappedTask.Wait(MediumNonDbgTimeout));
                        var args = DynamicSerializerState.CreateForRpc();
                        args.SetStruct(1, 0);
                        args.WriteData(0, 123456);
                        CancellationToken ctx;
                        IPromisedAnswer   answer;
                        using (answer = main.Call(0x1234567812345678, 0x3333, args))
                        {
                            Assert.IsTrue(mock.WhenCalled.Wait(MediumNonDbgTimeout));
                            (var interfaceId, var methodId, var inargs, var ct) = mock.WhenCalled.Result;
                            Assert.AreEqual <ulong>(0x1234567812345678, interfaceId);
                            Assert.AreEqual <ushort>(0x3333, methodId);
                            Assert.AreEqual(ObjectKind.Struct, inargs.Kind);
                            Assert.AreEqual(123456, inargs.ReadDataInt(0));
                            ctx = ct;
                        }

                        Assert.IsTrue(SpinWait.SpinUntil(() => ctx.IsCancellationRequested, MediumNonDbgTimeout));

                        var mbr = MessageBuilder.Create();
                        mbr.InitCapTable();
                        var result = new DynamicSerializerState(mbr);
                        result.SetStruct(1, 0);
                        result.WriteData(0, 654321);
                        mock.Return.SetResult(result);

                        // Even after the client cancelled the call, the server must still send
                        // a response.
                        async Task AwaitWhenReturned() => await answer.WhenReturned;

                        Assert.IsTrue(AwaitWhenReturned().ContinueWith(t => { }).Wait(MediumNonDbgTimeout));
                    }
                    finally
                    {
                        ExpectingLogOutput = true;
                    }
                }
        }
示例#4
0
        public void PipelineCallAfterDisposal()
        {
            (var server, var client) = SetupClientServerPair();

            using (server)
                using (client)
                {
                    Assert.IsTrue(client.WhenConnected.Wait(MediumNonDbgTimeout));
                    SpinWait.SpinUntil(() => server.ConnectionCount > 0, MediumNonDbgTimeout);
                    Assert.AreEqual(1, server.ConnectionCount);

                    var mock = new ProvidedCapabilityMock();
                    server.Main = mock;
                    var main = client.GetMain <BareProxy>();
                    Assert.IsTrue(main.WhenResolved.WrappedTask.Wait(MediumNonDbgTimeout));
                    var args = DynamicSerializerState.CreateForRpc();
                    args.SetStruct(1, 0);
                    args.WriteData(0, 123456);
                    BareProxy pipelined;
                    using (var answer = main.Call(0x1234567812345678, 0x3333, args))
                    {
                        Assert.IsTrue(mock.WhenCalled.Wait(MediumNonDbgTimeout));

                        pipelined = (BareProxy)CapabilityReflection.CreateProxy <BareProxy>(
                            answer.Access(new MemberAccessPath(new MemberAccessPath.MemberAccess[] { new MemberAccessPath.StructMemberAccess(1) })));
                    }

                    var args2 = DynamicSerializerState.CreateForRpc();
                    args2.SetStruct(1, 0);
                    args2.WriteData(0, 654321);

                    try
                    {
                        pipelined.Call(0x8765432187654321, 0x4444, args2);
                        Assert.Fail("Expected an exception here");
                    }
                    catch (ObjectDisposedException)
                    {
                    }
                    catch (TaskCanceledException)
                    {
                    }
                }
        }
示例#5
0
        public void CallCancelOnClient()
        {
            ExpectingLogOutput = false;

            (var server, var client) = SetupClientServerPair();

            using (server)
                using (client)
                {
                    try
                    {
                        Assert.IsTrue(client.WhenConnected.Wait(MediumNonDbgTimeout));
                        SpinWait.SpinUntil(() => server.ConnectionCount > 0, MediumNonDbgTimeout);
                        Assert.AreEqual(1, server.ConnectionCount);

                        var mock = new ProvidedCapabilityMock();
                        server.Main = mock;
                        var main      = client.GetMain <BareProxy>();
                        var resolving = main as IResolvingCapability;
                        Assert.IsTrue(resolving.WhenResolved.WrappedTask.Wait(MediumNonDbgTimeout));
                        var args = DynamicSerializerState.CreateForRpc();
                        args.SetStruct(1, 0);
                        args.WriteData(0, 123456);
                        CancellationToken ctx;
                        using (var answer = main.Call(0x1234567812345678, 0x3333, args))
                        {
                            Assert.IsTrue(mock.WhenCalled.Wait(MediumNonDbgTimeout));
                            (var interfaceId, var methodId, var inargs, var ct) = mock.WhenCalled.Result;
                            Assert.AreEqual <ulong>(0x1234567812345678, interfaceId);
                            Assert.AreEqual <ushort>(0x3333, methodId);
                            Assert.AreEqual(ObjectKind.Struct, inargs.Kind);
                            Assert.AreEqual(123456, inargs.ReadDataInt(0));
                            ctx = ct;
                        }

                        Assert.IsTrue(SpinWait.SpinUntil(() => ctx.IsCancellationRequested, MediumNonDbgTimeout));
                    }
                    finally
                    {
                        ExpectingLogOutput = true;
                    }
                }
        }
示例#6
0
        public void CallReturn()
        {
            (var server, var client) = SetupClientServerPair();

            using (server)
                using (client)
                {
                    Assert.IsTrue(client.WhenConnected.Wait(MediumNonDbgTimeout));
                    SpinWait.SpinUntil(() => server.ConnectionCount > 0, MediumNonDbgTimeout);
                    Assert.AreEqual(1, server.ConnectionCount);

                    var mock = new ProvidedCapabilityMock();
                    server.Main = mock;
                    var main = client.GetMain <BareProxy>();
                    Assert.IsTrue(main.WhenResolved.WrappedTask.Wait(MediumNonDbgTimeout));
                    var args = DynamicSerializerState.CreateForRpc();
                    args.SetStruct(1, 0);
                    args.WriteData(0, 123456);
                    using (var answer = main.Call(0x1234567812345678, 0x3333, args))
                    {
                        Assert.IsTrue(mock.WhenCalled.Wait(MediumNonDbgTimeout));
                        (var interfaceId, var methodId, var inargs, var ct) = mock.WhenCalled.Result;
                        Assert.AreEqual <ulong>(0x1234567812345678, interfaceId);
                        Assert.AreEqual <ushort>(0x3333, methodId);
                        Assert.AreEqual(ObjectKind.Struct, inargs.Kind);
                        Assert.AreEqual(123456, inargs.ReadDataInt(0));

                        var result = DynamicSerializerState.CreateForRpc();
                        result.SetStruct(1, 0);
                        result.WriteData(0, 654321);
                        mock.Return.SetResult(result);

                        Assert.IsTrue(answer.WhenReturned.WrappedTask.Wait(MediumNonDbgTimeout));
                        var outresult = answer.WhenReturned.Result;
                        Assert.AreEqual(ObjectKind.Struct, outresult.Kind);
                        Assert.AreEqual(654321, outresult.ReadDataInt(0));
                    }
                }
        }
示例#7
0
        public void PipelineMultiple()
        {
            (var server, var client) = SetupClientServerPair();

            using (server)
                using (client)
                {
                    Assert.IsTrue(client.WhenConnected.Wait(MediumNonDbgTimeout));
                    SpinWait.SpinUntil(() => server.ConnectionCount > 0, MediumNonDbgTimeout);
                    Assert.AreEqual(1, server.ConnectionCount);

                    var mock = new ProvidedCapabilityMock();
                    server.Main = mock;
                    var main = client.GetMain <BareProxy>();
                    Assert.IsTrue(main.WhenResolved.WrappedTask.Wait(MediumNonDbgTimeout));
                    var args = DynamicSerializerState.CreateForRpc();
                    args.SetStruct(1, 0);
                    args.WriteData(0, 123456);
                    using (var answer = main.Call(0x1234567812345678, 0x3333, args))
                    {
                        Assert.IsTrue(mock.WhenCalled.Wait(MediumNonDbgTimeout));

                        var pipelined = (BareProxy)CapabilityReflection.CreateProxy <BareProxy>(answer.Access(new MemberAccessPath(new MemberAccessPath.MemberAccess[] { new MemberAccessPath.StructMemberAccess(1) })));

                        var args2 = DynamicSerializerState.CreateForRpc();
                        args2.SetStruct(1, 0);
                        args2.WriteData(0, 111111);

                        var args3 = DynamicSerializerState.CreateForRpc();
                        args3.SetStruct(1, 0);
                        args3.WriteData(0, 222222);

                        using (var answer2 = pipelined.Call(0x1111111111111111, 0x1111, args2))
                            using (var answer3 = pipelined.Call(0x2222222222222222, 0x2222, args3))
                            {
                                (var interfaceId, var methodId, var inargs, var ct) = mock.WhenCalled.Result;

                                Assert.AreEqual <ulong>(0x1234567812345678, interfaceId);
                                Assert.AreEqual <ushort>(0x3333, methodId);
                                Assert.AreEqual(ObjectKind.Struct, inargs.Kind);
                                Assert.AreEqual(123456, inargs.ReadDataInt(0));

                                var mock2 = new ProvidedCapabilityMultiCallMock();

                                var result = DynamicSerializerState.CreateForRpc();
                                result.SetStruct(1, 2);
                                result.WriteData(0, 654321);
                                uint id = result.ProvideCapability(mock2).Value;
                                result.LinkToCapability(1, id);

                                mock.Return.SetResult(result);

                                Assert.IsTrue(answer.WhenReturned.WrappedTask.Wait(MediumNonDbgTimeout));
                                Assert.IsFalse(ct.IsCancellationRequested);

                                var args4 = DynamicSerializerState.CreateForRpc();
                                args4.SetStruct(1, 0);
                                args4.WriteData(0, 333333);

                                var args5 = DynamicSerializerState.CreateForRpc();
                                args5.SetStruct(1, 0);
                                args5.WriteData(0, 444444);

                                using (var answer4 = pipelined.Call(0x3333333333333333, 0x3333, args4))
                                    using (var answer5 = pipelined.Call(0x4444444444444444, 0x4444, args5))
                                    {
                                        var call2 = mock2.WhenCalled;
                                        var call3 = mock2.WhenCalled;
                                        var call4 = mock2.WhenCalled;
                                        var call5 = mock2.WhenCalled;

                                        Assert.IsTrue(call2.Wait(MediumNonDbgTimeout));
                                        Assert.IsTrue(call3.Wait(MediumNonDbgTimeout));
                                        Assert.IsTrue(call4.Wait(MediumNonDbgTimeout));
                                        Assert.IsTrue(call5.Wait(MediumNonDbgTimeout));

                                        Assert.AreEqual <ulong>(0x1111111111111111, call2.Result.InterfaceId);
                                        Assert.AreEqual <ulong>(0x2222222222222222, call3.Result.InterfaceId);
                                        Assert.AreEqual <ulong>(0x3333333333333333, call4.Result.InterfaceId);
                                        Assert.AreEqual <ulong>(0x4444444444444444, call5.Result.InterfaceId);

                                        var ret2 = DynamicSerializerState.CreateForRpc();
                                        ret2.SetStruct(1, 0);
                                        ret2.WriteData(0, -1);
                                        call2.Result.Result.SetResult(ret2);

                                        var ret3 = DynamicSerializerState.CreateForRpc();
                                        ret3.SetStruct(1, 0);
                                        ret3.WriteData(0, -2);
                                        call3.Result.Result.SetResult(ret3);

                                        var ret4 = DynamicSerializerState.CreateForRpc();
                                        ret4.SetStruct(1, 0);
                                        ret4.WriteData(0, -3);
                                        call4.Result.Result.SetResult(ret4);

                                        var ret5 = DynamicSerializerState.CreateForRpc();
                                        ret5.SetStruct(1, 0);
                                        ret5.WriteData(0, -4);
                                        call5.Result.Result.SetResult(ret5);

                                        Assert.IsTrue(answer2.WhenReturned.WrappedTask.Wait(MediumNonDbgTimeout));
                                        Assert.IsTrue(answer3.WhenReturned.WrappedTask.Wait(MediumNonDbgTimeout));
                                        Assert.IsTrue(answer4.WhenReturned.WrappedTask.Wait(MediumNonDbgTimeout));
                                        Assert.IsTrue(answer5.WhenReturned.WrappedTask.Wait(MediumNonDbgTimeout));

                                        Assert.AreEqual(-1, answer2.WhenReturned.Result.ReadDataInt(0));
                                        Assert.AreEqual(-2, answer3.WhenReturned.Result.ReadDataInt(0));
                                        Assert.AreEqual(-3, answer4.WhenReturned.Result.ReadDataInt(0));
                                        Assert.AreEqual(-4, answer5.WhenReturned.Result.ReadDataInt(0));
                                    }
                            }
                    }
                }
        }
示例#8
0
        public void PipelineAfterReturn()
        {
            (var server, var client) = SetupClientServerPair();

            using (server)
                using (client)
                {
                    Assert.IsTrue(client.WhenConnected.Wait(MediumNonDbgTimeout));
                    SpinWait.SpinUntil(() => server.ConnectionCount > 0, MediumNonDbgTimeout);
                    Assert.AreEqual(1, server.ConnectionCount);

                    var mock = new ProvidedCapabilityMock();
                    server.Main = mock;
                    var main = client.GetMain <BareProxy>();
                    Assert.IsTrue(main.WhenResolved.WrappedTask.Wait(MediumNonDbgTimeout));
                    var args = DynamicSerializerState.CreateForRpc();
                    args.SetStruct(1, 0);
                    args.WriteData(0, 123456);
                    using (var answer = main.Call(0x1234567812345678, 0x3333, args))
                    {
                        Assert.IsTrue(mock.WhenCalled.Wait(MediumNonDbgTimeout));

                        (var interfaceId, var methodId, var inargs, var ct) = mock.WhenCalled.Result;
                        Assert.AreEqual <ulong>(0x1234567812345678, interfaceId);
                        Assert.AreEqual <ushort>(0x3333, methodId);
                        Assert.AreEqual(ObjectKind.Struct, inargs.Kind);
                        Assert.AreEqual(123456, inargs.ReadDataInt(0));

                        var mock2 = new ProvidedCapabilityMock();

                        var result = DynamicSerializerState.CreateForRpc();
                        result.SetStruct(1, 2);
                        result.WriteData(0, 654321);
                        uint id = result.ProvideCapability(mock2).Value;
                        result.LinkToCapability(1, id);

                        mock.Return.SetResult(result);

                        using (var pipelined = (BareProxy)CapabilityReflection.CreateProxy <BareProxy>(
                                   answer.Access(
                                       new MemberAccessPath(
                                           new MemberAccessPath.MemberAccess[] {
                            new MemberAccessPath.StructMemberAccess(1)
                        }))))
                        {
                            var args2 = DynamicSerializerState.CreateForRpc();
                            args2.SetStruct(1, 0);
                            args2.WriteData(0, 654321);

                            using (var answer2 = pipelined.Call(0x8765432187654321, 0x4444, args2))
                            {
                                Assert.IsTrue(answer.WhenReturned.WrappedTask.Wait(MediumNonDbgTimeout));
                                Assert.IsTrue(mock2.WhenCalled.Wait(MediumNonDbgTimeout));

                                (var interfaceId2, var methodId2, var inargs2, var ct2) = mock2.WhenCalled.Result;
                                Assert.AreEqual <ulong>(0x8765432187654321, interfaceId2);
                                Assert.AreEqual <ushort>(0x4444, methodId2);
                                Assert.AreEqual(ObjectKind.Struct, inargs2.Kind);
                                Assert.AreEqual(654321, inargs2.ReadDataInt(0));

                                var result2 = DynamicSerializerState.CreateForRpc();
                                result2.SetStruct(1, 0);
                                result2.WriteData(0, 222222);
                                mock2.Return.SetResult(result2);

                                Assert.IsTrue(answer2.WhenReturned.WrappedTask.Wait(MediumNonDbgTimeout));
                                var outresult2 = answer2.WhenReturned.Result;
                                Assert.AreEqual(ObjectKind.Struct, outresult2.Kind);
                                Assert.AreEqual(222222, outresult2.ReadDataInt(0));
                            }
                        }
                    }
                }
        }