From 62f9e126912fa9a620a361fb5b88d33506e096fb Mon Sep 17 00:00:00 2001 From: vnugent Date: Sat, 14 Oct 2023 15:41:17 -0400 Subject: some refactoring and tests --- .../tests/Async/AsyncAccessSerializerTests.cs | 27 +++--- lib/Utils/tests/IO/VnMemoryStreamTests.cs | 99 ++++++++++++++++++++++ lib/Utils/tests/Memory/MemoryUtilTests.cs | 2 +- 3 files changed, 114 insertions(+), 14 deletions(-) create mode 100644 lib/Utils/tests/IO/VnMemoryStreamTests.cs (limited to 'lib/Utils/tests') diff --git a/lib/Utils/tests/Async/AsyncAccessSerializerTests.cs b/lib/Utils/tests/Async/AsyncAccessSerializerTests.cs index 7119d21..3c9bde7 100644 --- a/lib/Utils/tests/Async/AsyncAccessSerializerTests.cs +++ b/lib/Utils/tests/Async/AsyncAccessSerializerTests.cs @@ -2,12 +2,12 @@ using Microsoft.VisualStudio.TestTools.UnitTesting; using System; +using System.Linq; using System.Threading; +using System.Diagnostics; using System.Threading.Tasks; using System.Collections.Generic; -using System.Diagnostics; using System.Runtime.CompilerServices; -using System.Linq; namespace VNLib.Utils.Async.Tests { @@ -101,7 +101,7 @@ namespace VNLib.Utils.Async.Tests int maxCount = 64; - Task[] asyncArr = new int[maxCount].Select(async p => + Task[] asyncArr = new int[maxCount].Select(p => Task.Run(async () => { //Take a lock then random delay, then release Task entry = serializer.WaitAsync(DEFAULT_KEY); @@ -119,7 +119,7 @@ namespace VNLib.Utils.Async.Tests serializer.Release(DEFAULT_KEY); - }).ToArray(); + })).ToArray(); Task.WaitAll(asyncArr); } @@ -149,7 +149,7 @@ namespace VNLib.Utils.Async.Tests using CancellationTokenSource cts = new(500); - Task[] asyncArr = new int[maxCount].Select(async p => + Task[] asyncArr = new int[maxCount].Select(p => Task.Run(async () => { //Take a lock then random delay, then release await serializer.WaitAsync(DEFAULT_KEY, cts.Token); @@ -159,7 +159,7 @@ namespace VNLib.Utils.Async.Tests serializer.Release(DEFAULT_KEY); - }).ToArray(); + })).ToArray(); Task.WaitAll(asyncArr); @@ -175,18 +175,19 @@ namespace VNLib.Utils.Async.Tests //Alloc serailzer base on string IAsyncAccessSerializer serializer = new AsyncAccessSerializer(100, 100, StringComparer.Ordinal); - int maxCount = 128; + const int maxCount = 128; + const int itterations = 20; string test = ""; Stopwatch timer = new(); using CancellationTokenSource cts = new(500); - for (int i = 0; i < 10; i++) + for (int i = 0; i < itterations; i++) { test = ""; timer.Restart(); - Task[] asyncArr = new int[maxCount].Select(async p => + Task[] asyncArr = new int[maxCount].Select(p => Task.Run(async () => { //Take a lock then random delay, then release await serializer.WaitAsync(DEFAULT_KEY, cts.Token); @@ -196,7 +197,7 @@ namespace VNLib.Utils.Async.Tests serializer.Release(DEFAULT_KEY); - }).ToArray(); + })).ToArray(); Task.WaitAll(asyncArr); @@ -208,12 +209,12 @@ namespace VNLib.Utils.Async.Tests using SemaphoreSlim slim = new(1,1); - for (int i = 0; i < 10; i++) + for (int i = 0; i < itterations; i++) { test = ""; timer.Restart(); - Task[] asyncArr = new int[maxCount].Select(async p => + Task[] asyncArr = new int[maxCount].Select(p => Task.Run(async () => { //Take a lock then random delay, then release await slim.WaitAsync(cts.Token); @@ -222,7 +223,7 @@ namespace VNLib.Utils.Async.Tests test += "0"; slim.Release(); - }).ToArray(); + })).ToArray(); Task.WaitAll(asyncArr); diff --git a/lib/Utils/tests/IO/VnMemoryStreamTests.cs b/lib/Utils/tests/IO/VnMemoryStreamTests.cs new file mode 100644 index 0000000..3eb95ce --- /dev/null +++ b/lib/Utils/tests/IO/VnMemoryStreamTests.cs @@ -0,0 +1,99 @@ +using System; + +using Microsoft.VisualStudio.TestTools.UnitTesting; + +using VNLib.Utils.Memory; +using VNLib.Utils.Extensions; + +namespace VNLib.Utils.IO.Tests +{ + [TestClass()] + public class VnMemoryStreamTests + { + [TestMethod()] + public void VnMemoryStreamConstructorTest() + { + using (VnMemoryStream vms = new()) + { + Assert.IsTrue(vms.Length == 0); + Assert.IsTrue(vms.Position == 0); + Assert.IsTrue(vms.CanSeek == true); + Assert.IsTrue(vms.CanRead == true); + Assert.IsTrue(vms.CanWrite == true); + } + + //Test heap + IUnmangedHeap privateHeap = MemoryUtil.InitializeNewHeapForProcess(); + + using (VnMemoryStream vms = new(privateHeap, 1024, false)) + { + Assert.IsTrue(vms.Length == 0); + Assert.IsTrue(vms.Position == 0); + Assert.IsTrue(vms.CanSeek == true); + Assert.IsTrue(vms.CanRead == true); + Assert.IsTrue(vms.CanWrite == true); + } + + + //Create from mem handle + MemoryHandle handle = privateHeap.Alloc(byte.MaxValue); + + using (VnMemoryStream vms = VnMemoryStream.ConsumeHandle(handle, handle.GetIntLength(), false)) + { + Assert.IsTrue(vms.Length == byte.MaxValue); + Assert.IsTrue(vms.Position == 0); + Assert.IsTrue(vms.CanSeek == true); + Assert.IsTrue(vms.CanRead == true); + Assert.IsTrue(vms.CanWrite == true); + } + + //From existing data + ReadOnlySpan testSpan = new byte[] { 1, 2, 3, 4, 5, 6, 7, 8 }; + using (VnMemoryStream vms = new (privateHeap, testSpan)) + { + Assert.IsTrue(vms.Length == testSpan.Length); + Assert.IsTrue(vms.Position == 0); + + //Check values copied + while (vms.Position < vms.Length) + { + byte test = testSpan[(int)vms.Position]; + Assert.IsTrue(vms.ReadByte() == test); + } + } + + ReadOnlyMemory testMemory = new byte[] { 1, 2, 3, 4, 5, 6, 7, 8 }; + using (VnMemoryStream vms = new (privateHeap, testMemory)) + { + Assert.IsTrue(vms.Length == testMemory.Length); + Assert.IsTrue(vms.Position == 0); + + //Check values copied + while(vms.Position < vms.Length) + { + byte test = testMemory.Span[(int)vms.Position]; + Assert.IsTrue(vms.ReadByte() == test); + } + } + } + + [TestMethod()] + public void VnMemoryStreamReadonlyTest() + { + using VnMemoryStream vms = new(MemoryUtil.Shared, 0, false); + + Assert.IsTrue(vms.CanWrite == true); + + //Convert to readonly + _ = VnMemoryStream.CreateReadonly(vms); + + Assert.IsTrue(vms.CanSeek == true); + Assert.IsTrue(vms.CanRead == true); + Assert.IsTrue(vms.CanWrite == false); + + //Try to write + Assert.ThrowsException(() => vms.WriteByte(0)); + + } + } +} \ No newline at end of file diff --git a/lib/Utils/tests/Memory/MemoryUtilTests.cs b/lib/Utils/tests/Memory/MemoryUtilTests.cs index 2166eea..64f94ff 100644 --- a/lib/Utils/tests/Memory/MemoryUtilTests.cs +++ b/lib/Utils/tests/Memory/MemoryUtilTests.cs @@ -388,7 +388,7 @@ namespace VNLib.Utils.Memory.Tests IUnmangedHeap heap = MemoryUtil.InitializeNewHeapForProcess(); //Init wrapper and dispose - using TrackedHeapWrapper wrapper = new(heap); + using TrackedHeapWrapper wrapper = new(heap, true); //Confirm 0 stats HeapStatistics preTest = wrapper.GetCurrentStats(); -- cgit