X-Git-Url: http://plrg.eecs.uci.edu/git/?a=blobdiff_plain;f=folly%2Fexperimental%2Fbser%2Ftest%2FBserTest.cpp;h=97bf5c75dfadba6de334f8a6e4f9d5e9f11fccc2;hb=93f4d05d584569bdede7e2d124a21c31559ea93e;hp=61f07f2b5193501e110ce53acb64f531dc431d05;hpb=6374f552672fe630d7060937593c1982be448b87;p=folly.git diff --git a/folly/experimental/bser/test/BserTest.cpp b/folly/experimental/bser/test/BserTest.cpp index 61f07f2b..97bf5c75 100644 --- a/folly/experimental/bser/test/BserTest.cpp +++ b/folly/experimental/bser/test/BserTest.cpp @@ -118,5 +118,32 @@ TEST(Bser, PduLength) { EXPECT_EQ(len, 44) << "PduLength should be 44, got " << len; } +TEST(Bser, CursorLength) { + folly::bser::serialization_opts opts; + std::string inputStr("hello there please break"); + + // This test is exercising the decode logic for pathological + // fragmentation cases. We try a few permutations with the + // BSER header being fragmented to tickle boundary conditions + + auto longSerialized = folly::bser::toBser(inputStr, opts); + for (uint32_t i = 1; i < longSerialized.size(); ++i) { + folly::IOBufQueue q; + + q.append(folly::IOBuf::wrapBuffer(longSerialized.data(), i)); + uint32_t j = i; + while (j < longSerialized.size()) { + q.append(folly::IOBuf::wrapBuffer(&longSerialized[j], 1)); + ++j; + } + + auto pdu_len = folly::bser::decodePduLength(q.front()); + auto buf = q.split(pdu_len); + + auto hello = folly::bser::parseBser(buf.get()); + EXPECT_EQ(inputStr, hello.asString()); + } +} + /* vim:ts=2:sw=2:et: */