From 2f9b8b2000b71650ff5a2b72dae3a5312e670465 Mon Sep 17 00:00:00 2001 From: Dan Engelbrecht Date: Tue, 18 Nov 2025 16:34:17 +0100 Subject: loose chunk filtering bug when using wildcards (#654) * fix filtering of loose chunks when downloading with a filter add tests * changelog * move InlineRemoveUnusedHashes * remove extra braces --- src/zencore/testutils.cpp | 43 +++++++++++++++++++++++++++++++------------ 1 file changed, 31 insertions(+), 12 deletions(-) (limited to 'src/zencore/testutils.cpp') diff --git a/src/zencore/testutils.cpp b/src/zencore/testutils.cpp index 9f50de032..5bc2841ae 100644 --- a/src/zencore/testutils.cpp +++ b/src/zencore/testutils.cpp @@ -46,22 +46,41 @@ ScopedTemporaryDirectory::~ScopedTemporaryDirectory() IoBuffer CreateRandomBlob(uint64_t Size) { - static uint64_t Seed{0x7CEBF54E45B9F5D1}; - auto Next = [](uint64_t& seed) { - uint64_t z = (seed += UINT64_C(0x9E3779B97F4A7C15)); - z = (z ^ (z >> 30)) * UINT64_C(0xBF58476D1CE4E5B9); - z = (z ^ (z >> 27)) * UINT64_C(0x94D049BB133111EB); - return z ^ (z >> 31); - }; + static FastRandom Rand{.Seed = 0x7CEBF54E45B9F5D1}; + return CreateRandomBlob(Rand, Size); +}; + +IoBuffer +CreateSemiRandomBlob(uint64_t Size) +{ + IoBuffer Result(Size); + const size_t PartCount = (Size / (1u * 1024u * 64)) + 1; + const size_t PartSize = Size / PartCount; + auto Part = CreateRandomBlob(PartSize); + auto Remain = Result.GetMutableView().CopyFrom(Part.GetView()); + while (Remain.GetSize() >= PartSize) + { + Remain = Remain.CopyFrom(Part.GetView()); + } + if (Remain.GetSize() > 0) + { + auto RemainBuffer = CreateRandomBlob(Remain.GetSize()); + Remain.CopyFrom(RemainBuffer.GetView()); + } + return Result; +}; +IoBuffer +CreateRandomBlob(FastRandom& Rand, uint64_t Size) +{ IoBuffer Data(Size); uint64_t* DataPtr = reinterpret_cast(Data.MutableData()); while (Size > sizeof(uint64_t)) { - *DataPtr++ = Next(Seed); + *DataPtr++ = Rand.Next(); Size -= sizeof(uint64_t); } - uint64_t ByteNext = Next(Seed); + uint64_t ByteNext = Rand.Next(); uint8_t* ByteDataPtr = reinterpret_cast(DataPtr); while (Size > 0) { @@ -73,12 +92,12 @@ CreateRandomBlob(uint64_t Size) }; IoBuffer -CreateSemiRandomBlob(uint64_t Size) +CreateSemiRandomBlob(FastRandom& Rand, uint64_t Size) { IoBuffer Result(Size); const size_t PartCount = (Size / (1u * 1024u * 64)) + 1; const size_t PartSize = Size / PartCount; - auto Part = CreateRandomBlob(PartSize); + auto Part = CreateRandomBlob(Rand, PartSize); auto Remain = Result.GetMutableView().CopyFrom(Part.GetView()); while (Remain.GetSize() >= PartSize) { @@ -86,7 +105,7 @@ CreateSemiRandomBlob(uint64_t Size) } if (Remain.GetSize() > 0) { - auto RemainBuffer = CreateRandomBlob(Remain.GetSize()); + auto RemainBuffer = CreateRandomBlob(Rand, Remain.GetSize()); Remain.CopyFrom(RemainBuffer.GetView()); } return Result; -- cgit v1.2.3