From 91cf648809e6d8ac952b67e42efbac9e8c49d9d3 Mon Sep 17 00:00:00 2001 From: Reuben Bond <203839+ReubenBond@users.noreply.github.com> Date: Thu, 22 Jun 2023 11:31:20 -0700 Subject: [PATCH] Add regression test for #8503 (#8504) --- .../PooledBufferTests.cs | 59 ++++++++++++++++++- 1 file changed, 58 insertions(+), 1 deletion(-) diff --git a/test/Orleans.Serialization.UnitTests/PooledBufferTests.cs b/test/Orleans.Serialization.UnitTests/PooledBufferTests.cs index 41cda8c075..db0eb894f9 100644 --- a/test/Orleans.Serialization.UnitTests/PooledBufferTests.cs +++ b/test/Orleans.Serialization.UnitTests/PooledBufferTests.cs @@ -1,6 +1,8 @@ using System; using System.Buffers; +using Microsoft.Extensions.DependencyInjection; using Orleans.Serialization.Buffers; +using Orleans.Serialization.Session; using Xunit; namespace Orleans.Serialization.UnitTests @@ -85,8 +87,63 @@ public void LargeBufferRoundTrip_ReaderWriter() var rosReader = Reader.Create(ros, null); var rosArray = rosReader.ReadBytes((uint)randomData.Length); Assert.Equal(randomData, rosArray); - + buffer.Dispose(); } + + /// + /// Regression test for https://github.com/dotnet/orleans/issues/8503 + /// + [Fact] + public void PooledBuffer_WriteTwice() + { + var serviceProvider = new ServiceCollection() + .AddSerializer() + .BuildServiceProvider(); + var pool = serviceProvider.GetRequiredService(); + var serializer = serviceProvider.GetRequiredService(); + var obj = LargeObject.BuildRandom(); + + SerializeObject(pool, serializer, obj); + SerializeObject(pool, serializer, obj); + + static void SerializeObject(SerializerSessionPool pool, Serializer serializer, LargeObject obj) + { + Writer writer = default; + var session = pool.GetSession(); + try + { + writer = Writer.CreatePooled(session); + serializer.Serialize(obj, ref writer); + + var sequence = writer.Output.AsReadOnlySequence(); + Assert.Equal(writer.Output.Length, sequence.Length); + } + finally + { + writer.Dispose(); + session.Dispose(); + } + } + } + + [GenerateSerializer] + public readonly record struct LargeObject( + [property: Id(0)] Guid Id, + [property: Id(1)] (Guid, Guid)[] Values) + { + public static LargeObject BuildRandom() + { + var id = Guid.NewGuid(); + var values = new (Guid, Guid)[256]; + + for (var i = 0; i < values.Length; i++) + { + values[i] = (Guid.NewGuid(), Guid.NewGuid()); + } + + return new(id, values); + } + } } } \ No newline at end of file