19 #include <sys/types.h> 23 #include <glog/logging.h> 46 std::unique_ptr<IOBuf> iobufs(std::initializer_list<T> ranges) {
48 for (
auto&
range : ranges) {
57 TEST(RecordIOTest, Simple) {
61 writer.
write(iobufs({
"hello ",
"world"}));
62 writer.
write(iobufs({
"goodbye"}));
66 auto it = reader.
begin();
75 writer.
write(iobufs({
"meow"}));
76 writer.
write(iobufs({
"woof"}));
80 auto it = reader.
begin();
93 TEST(RecordIOTest, SmallRecords) {
94 constexpr
size_t kSize = 10;
96 memset(tmp,
'x', kSize);
100 for (
size_t i = 0;
i < kSize; ++
i) {
106 auto it = reader.
begin();
107 for (
size_t i = 1;
i < kSize; ++
i) {
115 TEST(RecordIOTest, MultipleFileIds) {
119 writer.
write(iobufs({
"hello"}));
123 writer.
write(iobufs({
"world"}));
127 writer.
write(iobufs({
"goodbye"}));
131 auto it = reader.
begin();
142 auto it = reader.
begin();
151 auto it = reader.
begin();
158 auto it = reader.
begin();
163 TEST(RecordIOTest, ExtraMagic) {
167 writer.
write(iobufs({
"hello"}));
179 auto it = reader.
begin();
189 void corrupt(
int fd, off_t pos) {
197 TEST(RecordIOTest, Randomized) {
198 SCOPED_TRACE(to<std::string>(
"Random seed is ", FLAGS_random_seed));
199 std::mt19937 rnd(FLAGS_random_seed);
201 size_t recordCount = std::uniform_int_distribution<uint32_t>(30, 300)(rnd);
203 std::uniform_int_distribution<uint32_t> recordSizeDist(1, 3 << 16);
204 std::uniform_int_distribution<uint32_t> charDist(0, 255);
205 std::uniform_int_distribution<uint32_t> junkDist(0, 1 << 20);
207 std::uniform_int_distribution<uint32_t> corruptDist(0, 4);
209 std::vector<std::pair<fbstring, off_t>>
records;
210 std::vector<off_t> corruptPositions;
211 records.reserve(recordCount);
217 for (
size_t i = 0;
i < 3; ++
i) {
219 for (
size_t j = 0; j < recordCount; ++j) {
220 off_t beginPos = writer.
filePos();
222 size_t recordSize = recordSizeDist(rnd);
224 for (
size_t k = 0;
k < recordSize; ++
k) {
227 writer.
write(iobufs({record}));
229 bool corrupt = (corruptDist(rnd) == 0);
232 std::uniform_int_distribution<uint32_t> corruptByteDist(
234 off_t corruptRel = corruptByteDist(rnd);
235 VLOG(1) <<
"n=" << records.size() <<
" bpos=" << beginPos
236 <<
" rsize=" << record.
size() <<
" corrupt rel=" << corruptRel
237 <<
" abs=" << beginPos + corruptRel;
238 corruptPositions.push_back(beginPos + corruptRel);
240 VLOG(2) <<
"n=" << records.size() <<
" bpos=" << beginPos
241 <<
" rsize=" << record.
size() <<
" good";
242 records.emplace_back(
std::move(record), beginPos);
245 VLOG(1) <<
"n=" << records.size() <<
" close abs=" << writer.
filePos();
248 for (
auto& pos : corruptPositions) {
249 corrupt(file.
fd(), pos);
255 for (
auto& r : reader) {
270 gflags::ParseCommandLineFlags(&argc, &argv,
true);
DEFINE_int32(random_seed, folly::randomNumberSeed(),"random seed")
constexpr size_t headerSize()
void write(const T &in, folly::io::Appender &appender)
#define ASSERT_LT(val1, val2)
static std::unique_ptr< IOBuf > wrapBuffer(const void *buf, std::size_t capacity)
int RUN_ALL_TESTS() GTEST_MUST_USE_RESULT_
#define EXPECT_EQ(val1, val2)
constexpr detail::Map< Move > move
#define SCOPED_TRACE(message)
—— Concurrent Priority Queue Implementation ——
void reserve(size_type res_arg=0)
size_t read(T &out, folly::io::Cursor &cursor)
constexpr Range< Iter > range(Iter first, Iter last)
void push_back(const value_type c)
TEST(ProgramOptionsTest, Errors)
#define EXPECT_TRUE(condition)
Range< const unsigned char * > ByteRange
int main(int argc, char *argv[])
GTEST_API_ void InitGoogleTest(int *argc, char **argv)
#define ASSERT_FALSE(condition)
void write(std::unique_ptr< IOBuf > buf)
Range< const char * > StringPiece
uint32_t randomNumberSeed()
constexpr detail::First first