示例#1
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;
                    }
                }
        }
示例#2
0
        public void ListOfPointers()
        {
            var mb    = MessageBuilder.Create(1);
            var alloc = mb.Allocator;
            var ds    = new DynamicSerializerState(mb);
            int count = 77;

            ds.SetListOfPointers(count);
            var dse0 = ds.BuildPointer(0);

            dse0.SetStruct(1, 0);
            dse0.WriteData(0, 654);
            var dse1 = new DynamicSerializerState(mb);

            dse1.SetStruct(1, 0);
            dse1.WriteData(0, 555);
            ds.Link(1, dse1);
            ds.Link(2, dse1);
            var dse3 = ds.BuildPointer(3);

            dse3.SetListOfValues(32, 10);

            DeserializerState d = ds;

            Assert.AreEqual(ObjectKind.ListOfPointers, d.Kind);
            Assert.AreEqual(count, d.ListElementCount);
            var pointers = d.RequireList().Cast(_ => _);

            Assert.AreEqual(ObjectKind.Struct, pointers[0].Kind);
            Assert.AreEqual(654, pointers[0].ReadDataInt(0));
            Assert.AreEqual(ObjectKind.Struct, pointers[1].Kind);
            Assert.AreEqual(555, pointers[1].ReadDataInt(0));
            Assert.AreEqual(ObjectKind.Struct, pointers[2].Kind);
            Assert.AreEqual(555, pointers[2].ReadDataInt(0));
            Assert.AreEqual(ObjectKind.ListOfInts, pointers[3].Kind);
            Assert.AreEqual(10, pointers[3].ListElementCount);
            Assert.AreEqual(ObjectKind.Nil, pointers[4].Kind);
            Assert.ThrowsException <IndexOutOfRangeException>(() =>
            {
                var dummy = pointers[-1];
            });
            Assert.ThrowsException <IndexOutOfRangeException>(() =>
            {
                var dummy = pointers[count];
            });
        }
示例#3
0
        public void MultiSegmentStruct()
        {
            var mb    = MessageBuilder.Create(1);
            var alloc = mb.Allocator;
            var ds    = new DynamicSerializerState(mb);

            ds.SetStruct(1, 2);
            ds.WriteData(0, 815);
            string s0 = "Lorem ipsum dolor sit amet";

            ds.WriteText(0, s0);
            string s1 = "All men are created equal";

            ds.WriteText(1, s1);
            Assert.IsTrue(alloc.Segments.Count >= 3);

            DeserializerState d = ds;

            Assert.AreEqual(815, d.ReadDataInt(0));
            Assert.AreEqual(s0, d.ReadText(0));
            Assert.AreEqual(s1, d.ReadText(1));
        }
示例#4
0
        public void StructRecursion()
        {
            var mb    = MessageBuilder.Create(8);
            var alloc = mb.Allocator;
            var ds    = new DynamicSerializerState(mb);

            ds.SetStruct(1, 1);
            ds.WriteData(0, 123);
            ds.Link(0, ds, false);

            DeserializerState d = ds;

            Assert.AreEqual(123, d.ReadDataInt(0));
            Assert.AreEqual(123, d.StructReadPointer(0).ReadDataInt(0));
            Assert.ThrowsException <DeserializationException>(() =>
            {
                for (int i = 0; i < 64000000; i++)
                {
                    d = d.StructReadPointer(0);
                }
            });
        }
示例#5
0
        public void SharedPointer()
        {
            var mb    = MessageBuilder.Create(128);
            var alloc = mb.Allocator;

            var ds0 = new DynamicSerializerState(mb);

            ds0.SetStruct(1, 0);
            ds0.WriteData(0, 123);

            var ds1 = new DynamicSerializerState(mb);

            ds1.SetStruct(0, 1);
            ds1.Link(0, ds0);

            var ds2 = new DynamicSerializerState(mb);

            ds2.SetStruct(0, 1);
            ds2.Link(0, ds0);

            DeserializerState d1 = ds1;

            Assert.AreEqual(ObjectKind.Struct, d1.Kind);
            var e1 = d1.StructReadPointer(0);

            Assert.AreEqual(ObjectKind.Struct, e1.Kind);
            Assert.AreEqual(123, e1.ReadDataInt(0));

            DeserializerState d2 = ds2;

            Assert.AreEqual(ObjectKind.Struct, d2.Kind);
            var e2 = d2.StructReadPointer(0);

            Assert.AreEqual(ObjectKind.Struct, e2.Kind);
            Assert.AreEqual(123, e2.ReadDataInt(0));
        }
示例#6
0
        public void DeepCopy()
        {
            var mb     = MessageBuilder.Create(128);
            var alloc1 = mb.Allocator;
            var ds1    = new DynamicSerializerState(mb);

            ds1.SetStruct(10, 18);
            for (int i = 0; i < 10; i++)
            {
                ds1.WriteData(64 * (ulong)i, i);
                var el = ds1.BuildPointer(i);
                el.SetStruct(1, 0);
                el.WriteData(0, -i);
            }
            var los1 = ds1.BuildPointer(10);

            los1.SetListOfStructs(1, 1, 0);
            var el1 = los1.ListBuildStruct(0);

            el1.WriteData(0, 111);
            var lov1 = ds1.BuildPointer(11);

            lov1.SetListOfValues(1, 7);
            lov1.ListWriteValue(2, true);
            lov1.ListWriteValue(3, true);
            lov1.ListWriteValue(5, true);
            var lovu8 = ds1.BuildPointer(12);

            lovu8.SetListOfValues(8, 5);
            lovu8.ListWriteValue(1, (byte)0x55);
            lovu8.ListWriteValue(2, (byte)0xaa);
            var lovu16 = ds1.BuildPointer(13);

            lovu16.SetListOfValues(16, 3);
            lovu16.ListWriteValue(0, (ushort)0x1111);
            lovu16.ListWriteValue(1, (ushort)0x2222);
            lovu16.ListWriteValue(2, (ushort)0x3333);
            var lovu32 = ds1.BuildPointer(14);

            lovu32.SetListOfValues(32, 9);
            lovu32.ListWriteValue(1, 1u);
            lovu32.ListWriteValue(2, 4u);
            lovu32.ListWriteValue(3, 9u);
            lovu32.ListWriteValue(4, 16u);
            lovu32.ListWriteValue(5, 25u);
            lovu32.ListWriteValue(6, 36u);
            lovu32.ListWriteValue(7, 49u);
            lovu32.ListWriteValue(8, 64u);
            var lov64 = ds1.BuildPointer(15);

            lov64.SetListOfValues(64, 2);
            lov64.ListWriteValue(0, long.MinValue);
            lov64.ListWriteValue(1, long.MaxValue);
            var lop1 = ds1.BuildPointer(16);

            lop1.SetListOfPointers(1);
            lop1.LinkToCapability(0, 19);
            var loe1 = ds1.BuildPointer(17);

            loe1.SetListOfValues(0, 100);

            var mb2    = MessageBuilder.Create(128);
            var alloc2 = mb2.Allocator;
            var ds2    = new DynamicSerializerState(mb2);

            ds2.SetStruct(0, 3);
            Assert.ThrowsException <InvalidOperationException>(() =>
                                                               ds2.Link(0, ds1, false));
            ds2.Link(0, ds1, true);
            var lop = ds2.BuildPointer(1);

            lop.SetListOfPointers(1);
            lop.Link(0, ds1);
            ds2.Link(2, el1, true);

            void VerifyBigStruct(DeserializerState ds)
            {
                Assert.AreEqual(ObjectKind.Struct, ds.Kind);
                Assert.AreEqual <ushort>(10, ds.StructDataCount);
                Assert.AreEqual <ushort>(18, ds.StructPtrCount);
                for (int i = 0; i < 10; i++)
                {
                    Assert.AreEqual(i, ds.ReadDataInt(64 * (ulong)i));
                    var el = ds.StructReadPointer(i);
                    Assert.AreEqual(ObjectKind.Struct, el.Kind);
                    Assert.AreEqual(-i, el.ReadDataInt(0));
                }
                var elx = ds.StructReadPointer(10);

                Assert.AreEqual(ObjectKind.ListOfStructs, elx.Kind);
                Assert.AreEqual(1, elx.ListElementCount);
                var el0 = elx.RequireList().Cast(_ => _)[0];

                Assert.AreEqual(111, el0.ReadDataInt(0));

                var e11 = ds.StructReadPointer(11);

                Assert.AreEqual(ObjectKind.ListOfBits, e11.Kind);
                Assert.AreEqual(7, e11.ListElementCount);
                Assert.IsTrue(e11.RequireList().CastBool()[2]);
                Assert.IsTrue(e11.RequireList().CastBool()[3]);
                Assert.IsTrue(e11.RequireList().CastBool()[5]);

                var e12 = ds.StructReadPointer(12);

                Assert.AreEqual(ObjectKind.ListOfBytes, e12.Kind);
                Assert.AreEqual(5, e12.ListElementCount);
                Assert.AreEqual((byte)0x55, e12.RequireList().CastByte()[1]);
                Assert.AreEqual((byte)0xaa, e12.RequireList().CastByte()[2]);

                var e13 = ds.StructReadPointer(13);

                Assert.AreEqual(ObjectKind.ListOfShorts, e13.Kind);
                Assert.AreEqual(3, e13.ListElementCount);
                Assert.AreEqual((ushort)0x1111, e13.RequireList().CastUShort()[0]);
                Assert.AreEqual((ushort)0x2222, e13.RequireList().CastUShort()[1]);
                Assert.AreEqual((ushort)0x3333, e13.RequireList().CastUShort()[2]);

                var e14 = ds.StructReadPointer(14);

                Assert.AreEqual(ObjectKind.ListOfInts, e14.Kind);
                Assert.AreEqual(9, e14.ListElementCount);
                Assert.AreEqual((uint)0, e14.RequireList().CastUInt()[0]);
                Assert.AreEqual((uint)1, e14.RequireList().CastUInt()[1]);
                Assert.AreEqual((uint)4, e14.RequireList().CastUInt()[2]);
                Assert.AreEqual((uint)9, e14.RequireList().CastUInt()[3]);
                Assert.AreEqual((uint)16, e14.RequireList().CastUInt()[4]);
                Assert.AreEqual((uint)25, e14.RequireList().CastUInt()[5]);
                Assert.AreEqual((uint)36, e14.RequireList().CastUInt()[6]);
                Assert.AreEqual((uint)49, e14.RequireList().CastUInt()[7]);
                Assert.AreEqual((uint)64, e14.RequireList().CastUInt()[8]);

                var e15 = ds.StructReadPointer(15);

                Assert.AreEqual(ObjectKind.ListOfLongs, e15.Kind);
                Assert.AreEqual(2, e15.ListElementCount);
                Assert.AreEqual(long.MinValue, e15.RequireList().CastLong()[0]);
                Assert.AreEqual(long.MaxValue, e15.RequireList().CastLong()[1]);

                var e16 = ds.StructReadPointer(16);

                Assert.AreEqual(ObjectKind.ListOfPointers, e16.Kind);
                Assert.AreEqual(1, e16.ListElementCount);
                var cap = e16.RequireList().Cast(_ => _)[0];

                Assert.AreEqual(ObjectKind.Capability, cap.Kind);
                Assert.AreEqual(19u, cap.CapabilityIndex);

                var e17 = ds.StructReadPointer(17);

                Assert.AreEqual(ObjectKind.ListOfEmpty, e17.Kind);
                Assert.AreEqual(100, e17.ListElementCount);
            }

            DeserializerState d = ds2;

            Assert.AreEqual(ObjectKind.Struct, d.Kind);
            var p0 = d.StructReadPointer(0);

            VerifyBigStruct(p0);
            var p1 = d.StructReadPointer(1);

            Assert.AreEqual(ObjectKind.ListOfPointers, p1.Kind);
            var p1el0 = p1.RequireList().Cast(_ => _)[0];

            VerifyBigStruct(p1el0);
            var p2 = d.StructReadPointer(2);

            Assert.AreEqual(ObjectKind.Struct, p2.Kind);
            Assert.AreEqual(111, p2.ReadDataInt(0));
        }
示例#7
0
        public void StructWithPrimitives()
        {
            var mb    = MessageBuilder.Create(8);
            var alloc = mb.Allocator;
            var ds    = new DynamicSerializerState(mb);

            ds.SetStruct(10, 0);
            ds.WriteData(0, ulong.MaxValue - 1, ulong.MaxValue);
            ds.WriteData(64, long.MaxValue - 1, -123);
            ds.WriteData(128, uint.MaxValue - 1, 123);
            ds.WriteData(160, int.MaxValue - 1, -123);
            ds.WriteData(192, (ushort)(ushort.MaxValue - 1), (ushort)321);
            ds.WriteData(208, (short)(short.MaxValue - 1), (short)321);
            ds.WriteData(224, (byte)(byte.MaxValue - 1), (byte)111);
            ds.WriteData(232, (sbyte)(sbyte.MaxValue - 1), (sbyte)(-111));
            ds.WriteData(240, false, false);
            ds.WriteData(241, false, true);
            ds.WriteData(242, true, false);
            ds.WriteData(243, true, true);
            ds.WriteData(256, 12.34, 0.5);
            ds.WriteData(320, 1.2f, 0.5f);

            DeserializerState d = ds;

            Assert.AreEqual(ulong.MaxValue - 1, d.ReadDataULong(0, ulong.MaxValue));
            Assert.AreEqual(long.MaxValue - 1, d.ReadDataLong(64, -123));
            Assert.AreEqual(uint.MaxValue - 1, d.ReadDataUInt(128, 123));
            Assert.AreEqual(int.MaxValue - 1, d.ReadDataInt(160, -123));
            Assert.AreEqual(ushort.MaxValue - 1, d.ReadDataUShort(192, 321));
            Assert.AreEqual(short.MaxValue - 1, d.ReadDataShort(208, 321));
            Assert.AreEqual(byte.MaxValue - 1, d.ReadDataByte(224, 111));
            Assert.AreEqual(sbyte.MaxValue - 1, d.ReadDataSByte(232, -111));
            Assert.AreEqual(false, d.ReadDataBool(240, false));
            Assert.AreEqual(false, d.ReadDataBool(241, true));
            Assert.AreEqual(true, d.ReadDataBool(242, false));
            Assert.AreEqual(true, d.ReadDataBool(243, true));
            Assert.AreEqual(12.34, d.ReadDataDouble(256, 0.5));
            Assert.AreEqual(1.2f, d.ReadDataFloat(320, 0.5f));
        }