From 1a1ad9e6505525e30389e65305d9e9aa42609ace Mon Sep 17 00:00:00 2001 From: weidai Date: Tue, 29 Jun 2010 01:12:49 +0000 Subject: [PATCH] randomize test buffer length and alignment to better detect alignment-related bugs --- datatest.cpp | 22 ++++++++++++++++++---- 1 file changed, 18 insertions(+), 4 deletions(-) diff --git a/datatest.cpp b/datatest.cpp index b7b73da8..cfac74a0 100644 --- a/datatest.cpp +++ b/datatest.cpp @@ -57,9 +57,22 @@ const std::string & GetRequiredDatum(const TestData &data, const char *name) return i->second; } +void RandomizedTransfer(BufferedTransformation &source, BufferedTransformation &target, bool finish) +{ + while (source.MaxRetrievable() > (finish ? 0 : 4096)) + { + byte buf[4096+64]; + word32 start = GlobalRNG().GenerateWord32(0, 63); + word32 len = GlobalRNG().GenerateWord32(1, UnsignedMin(4096U, source.MaxRetrievable())); + source.Get(buf+start, len); + target.Put(buf+start, len); + } +} + void PutDecodedDatumInto(const TestData &data, const char *name, BufferedTransformation &target) { std::string s1 = GetRequiredDatum(data, name), s2; + ByteQueue q; while (!s1.empty()) { @@ -67,7 +80,7 @@ void PutDecodedDatumInto(const TestData &data, const char *name, BufferedTransfo { s1 = s1.substr(1); if (s1.empty()) - return; //avoid invalid read if s1 is empty + goto end; // avoid invalid read if s1 is empty } int repeat = 1; @@ -95,14 +108,15 @@ void PutDecodedDatumInto(const TestData &data, const char *name, BufferedTransfo s1 = s1.substr(STDMIN(s1.find(' '), s1.length())); } - ByteQueue q; while (repeat--) { q.Put((const byte *)s2.data(), s2.size()); - if (q.MaxRetrievable() > 4*1024 || repeat == 0) - q.TransferTo(target); + RandomizedTransfer(q, target, false); } } + +end: + RandomizedTransfer(q, target, true); } std::string GetDecodedDatum(const TestData &data, const char *name)