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; } } }
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]; }); }
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)); }
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); } }); }
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)); }
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)); }
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)); }