/*
- * Copyright 2016 Facebook, Inc.
+ * Copyright 2013-present Facebook, Inc.
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
*/
#include <folly/io/IOBufQueue.h>
-#include <folly/Range.h>
-
-#include <gflags/gflags.h>
-#include <gtest/gtest.h>
+#include <cstring>
#include <iostream>
#include <stdexcept>
-#include <string.h>
+
+#include <folly/Range.h>
+#include <folly/portability/GTest.h>
using folly::IOBuf;
using folly::IOBufQueue;
};
Initializer initializer;
-unique_ptr<IOBuf>
-stringToIOBuf(const char* s, uint32_t len) {
+unique_ptr<IOBuf> stringToIOBuf(const char* s, size_t len) {
unique_ptr<IOBuf> buf = IOBuf::create(len);
memcpy(buf->writableTail(), s, len);
buf->append(len);
}
}
-}
+} // namespace
TEST(IOBufQueue, Simple) {
IOBufQueue queue(clOptions);
checkConsistency(queue);
}
+TEST(IOBufQueue, SplitAtMost) {
+ IOBufQueue queue(clOptions);
+ queue.append(stringToIOBuf(SCL("Hello,")));
+ queue.append(stringToIOBuf(SCL(" World")));
+ auto buf = queue.splitAtMost(9999);
+ EXPECT_EQ(buf->computeChainDataLength(), 12);
+ EXPECT_TRUE(queue.empty());
+}
+
+TEST(IOBufQueue, SplitZero) {
+ IOBufQueue queue(clOptions);
+ queue.append(stringToIOBuf(SCL("Hello world")));
+ auto buf = queue.split(0);
+ EXPECT_EQ(buf->computeChainDataLength(), 0);
+}
+
TEST(IOBufQueue, Preallocate) {
IOBufQueue queue(clOptions);
queue.append(string("Hello"));
- pair<void*,uint32_t> writable = queue.preallocate(2, 64, 64);
+ pair<void*, uint64_t> writable = queue.preallocate(2, 64, 64);
checkConsistency(queue);
EXPECT_NE((void*)nullptr, writable.first);
EXPECT_LE(2, writable.second);
checkConsistency(queue);
}
+TEST(IOBufQueue, TrimStartAtMost) {
+ IOBufQueue queue(clOptions);
+ unique_ptr<IOBuf> a = IOBuf::create(4);
+ a->append(4);
+ queue.append(std::move(a));
+ checkConsistency(queue);
+ a = IOBuf::create(6);
+ a->append(6);
+ queue.append(std::move(a));
+ checkConsistency(queue);
+ a = IOBuf::create(8);
+ a->append(8);
+ queue.append(std::move(a));
+ checkConsistency(queue);
+ a = IOBuf::create(10);
+ a->append(10);
+ queue.append(std::move(a));
+ checkConsistency(queue);
+
+ EXPECT_EQ(4, queue.front()->countChainElements());
+ EXPECT_EQ(28, queue.front()->computeChainDataLength());
+ EXPECT_EQ(4, queue.front()->length());
+
+ queue.trimStartAtMost(1);
+ checkConsistency(queue);
+ EXPECT_EQ(4, queue.front()->countChainElements());
+ EXPECT_EQ(27, queue.front()->computeChainDataLength());
+ EXPECT_EQ(3, queue.front()->length());
+
+ queue.trimStartAtMost(50);
+ checkConsistency(queue);
+ EXPECT_EQ(nullptr, queue.front());
+ EXPECT_EQ(0, queue.chainLength());
+}
+
+TEST(IOBufQueue, TrimEndAtMost) {
+ IOBufQueue queue(clOptions);
+ unique_ptr<IOBuf> a = IOBuf::create(4);
+ a->append(4);
+ queue.append(std::move(a));
+ checkConsistency(queue);
+ a = IOBuf::create(6);
+ a->append(6);
+ queue.append(std::move(a));
+ checkConsistency(queue);
+ a = IOBuf::create(8);
+ a->append(8);
+ queue.append(std::move(a));
+ checkConsistency(queue);
+ a = IOBuf::create(10);
+ a->append(10);
+ queue.append(std::move(a));
+ checkConsistency(queue);
+
+ EXPECT_EQ(4, queue.front()->countChainElements());
+ EXPECT_EQ(28, queue.front()->computeChainDataLength());
+ EXPECT_EQ(4, queue.front()->length());
+
+ queue.trimEndAtMost(1);
+ checkConsistency(queue);
+ EXPECT_EQ(4, queue.front()->countChainElements());
+ EXPECT_EQ(27, queue.front()->computeChainDataLength());
+ EXPECT_EQ(4, queue.front()->length());
+
+ queue.trimEndAtMost(50);
+ checkConsistency(queue);
+ EXPECT_EQ(nullptr, queue.front());
+ EXPECT_EQ(0, queue.chainLength());
+}
+
TEST(IOBufQueue, TrimPack) {
IOBufQueue queue(clOptions);
unique_ptr<IOBuf> a = IOBuf::create(64);
EXPECT_EQ("hello world", s);
}
-int main(int argc, char** argv) {
- testing::InitGoogleTest(&argc, argv);
- gflags::ParseCommandLineFlags(&argc, &argv, true);
+TEST(IOBufQueue, Gather) {
+ IOBufQueue queue;
+
+ queue.append(stringToIOBuf(SCL("hello ")));
+ queue.append(stringToIOBuf(SCL("world")));
- return RUN_ALL_TESTS();
+ EXPECT_EQ(queue.front()->length(), 6);
+ queue.gather(11);
+ EXPECT_EQ(queue.front()->length(), 11);
+
+ StringPiece s(
+ reinterpret_cast<const char*>(queue.front()->data()),
+ queue.front()->length());
+ EXPECT_EQ("hello world", s);
}