summaryrefslogtreecommitdiff
path: root/test/buffer.cc
diff options
context:
space:
mode:
Diffstat (limited to 'test/buffer.cc')
-rw-r--r--test/buffer.cc252
1 files changed, 228 insertions, 24 deletions
diff --git a/test/buffer.cc b/test/buffer.cc
index 869e781..3bbfc95 100644
--- a/test/buffer.cc
+++ b/test/buffer.cc
@@ -4,19 +4,30 @@
#include <cstring>
-TEST(buffer_fixed, empty) {
- auto buffer = Buffer::fixed(10);
- EXPECT_TRUE(buffer->empty());
- EXPECT_FALSE(buffer->full());
- size_t avail;
- buffer->rptr(avail);
- EXPECT_EQ(0, avail);
- buffer->wptr(avail);
- EXPECT_EQ(10, avail);
-}
+namespace {
+
+enum class BufferType : uint8_t {
+ Fixed,
+ Dynamic,
+};
+
+class BufferTest : public testing::TestWithParam<BufferType> {
+ protected:
+ std::unique_ptr<Buffer> make(size_t min_size, size_t max_size) {
+ switch (GetParam()) {
+ case BufferType::Fixed:
+ return Buffer::fixed(min_size);
+ case BufferType::Dynamic:
+ return Buffer::dynamic(min_size, max_size);
+ }
+ std::unreachable();
+ }
+};
+
+} // namespace
-TEST(buffer_dynamic, empty) {
- auto buffer = Buffer::dynamic(10, 100);
+TEST_P(BufferTest, empty) {
+ auto buffer = make(10, 100);
EXPECT_TRUE(buffer->empty());
EXPECT_FALSE(buffer->full());
size_t avail;
@@ -26,8 +37,8 @@ TEST(buffer_dynamic, empty) {
EXPECT_EQ(10, avail);
}
-TEST(buffer_fixed, write_read) {
- auto buffer = Buffer::fixed(10);
+TEST_P(BufferTest, write_read) {
+ auto buffer = make(10, 100);
size_t avail;
auto* wptr = buffer->wptr(avail);
EXPECT_EQ(10, avail);
@@ -45,21 +56,214 @@ TEST(buffer_fixed, write_read) {
EXPECT_TRUE(buffer->empty());
}
-TEST(buffer_dynamic, write_read) {
- auto buffer = Buffer::dynamic(10, 100);
+TEST_P(BufferTest, write_read2) {
+ auto buffer = make(10, 10);
size_t avail;
auto* wptr = buffer->wptr(avail);
EXPECT_EQ(10, avail);
- memcpy(wptr, "Hello", 6);
- buffer->commit(6);
- EXPECT_FALSE(buffer->empty());
+ memcpy(wptr, "0123456789", 10);
+ buffer->commit(10);
+
auto* rptr = buffer->rptr(avail);
- EXPECT_EQ(6, avail);
- EXPECT_STREQ("Hello", reinterpret_cast<const char*>(rptr));
- buffer->consume(3);
+ EXPECT_EQ(10, avail);
+ char tmp[11];
+ memcpy(tmp, rptr, 5);
+ tmp[5] = '\0';
+ EXPECT_STREQ("01234", tmp);
+ buffer->consume(5);
+
+ wptr = buffer->wptr(avail, 5);
+ EXPECT_EQ(5, avail);
+ memcpy(wptr, "abcde", 5);
+ buffer->commit(5);
+
rptr = buffer->rptr(avail);
- EXPECT_EQ(3, avail);
- EXPECT_STREQ("lo", reinterpret_cast<const char*>(rptr));
+ EXPECT_LE(5, avail);
+ memcpy(tmp, rptr, 5);
+ tmp[5] = '\0';
+ EXPECT_STREQ("56789", tmp);
+ buffer->consume(5);
+
+ rptr = buffer->rptr(avail, 5);
+ EXPECT_EQ(5, avail);
+ memcpy(tmp, rptr, 5);
+ tmp[5] = '\0';
+ EXPECT_STREQ("abcde", tmp);
+ buffer->consume(5);
+}
+
+TEST_P(BufferTest, write_read3) {
+ auto buffer = make(10, 10);
+ size_t avail;
+ auto* wptr = buffer->wptr(avail);
+ EXPECT_EQ(10, avail);
+ memcpy(wptr, "0123456789", 10);
+ buffer->commit(10);
+
+ auto* rptr = buffer->rptr(avail);
+ EXPECT_EQ(10, avail);
+ char tmp[11];
+ memcpy(tmp, rptr, 5);
+ tmp[5] = '\0';
+ EXPECT_STREQ("01234", tmp);
+ buffer->consume(5);
+
+ wptr = buffer->wptr(avail, 5);
+ EXPECT_EQ(5, avail);
+ memcpy(wptr, "abcde", 5);
+ buffer->commit(5);
+
+ rptr = buffer->rptr(avail, 10);
+ EXPECT_EQ(10, avail);
+ memcpy(tmp, rptr, 10);
+ tmp[10] = '\0';
+ EXPECT_STREQ("56789abcde", tmp);
+ buffer->consume(5);
+}
+
+TEST_P(BufferTest, write_read4) {
+ auto buffer = make(10, 10);
+ size_t avail;
+ auto* wptr = buffer->wptr(avail);
+ EXPECT_EQ(10, avail);
+ memcpy(wptr, "0123456789", 10);
+ buffer->commit(10);
+
+ auto* rptr = buffer->rptr(avail);
+ EXPECT_EQ(10, avail);
+ char tmp[11];
+ memcpy(tmp, rptr, 10);
+ tmp[10] = '\0';
+ EXPECT_STREQ("0123456789", tmp);
+ buffer->consume(10);
+}
+
+TEST_P(BufferTest, write_read5) {
+ auto buffer = make(10, 10);
+ size_t avail;
+ auto* wptr = buffer->wptr(avail);
+ EXPECT_EQ(10, avail);
+ memcpy(wptr, "01234", 5);
+ buffer->commit(5);
+
+ auto* rptr = buffer->rptr(avail);
+ EXPECT_EQ(5, avail);
+ char tmp[11];
+ memcpy(tmp, rptr, 3);
+ tmp[3] = '\0';
+ EXPECT_STREQ("012", tmp);
buffer->consume(3);
+
+ wptr = buffer->wptr(avail, 8);
+ EXPECT_EQ(8, avail);
+ memcpy(wptr, "<xxxxxx>", 8);
+ buffer->commit(8);
+
+ rptr = buffer->rptr(avail, 10);
+ EXPECT_EQ(10, avail);
+ memcpy(tmp, rptr, 10);
+ tmp[10] = '\0';
+ EXPECT_STREQ("34<xxxxxx>", tmp);
+ buffer->consume(10);
+}
+
+TEST_P(BufferTest, write_read6) {
+ auto buffer = make(10, 10);
+ size_t avail;
+ auto* wptr = buffer->wptr(avail);
+ EXPECT_EQ(10, avail);
+ memcpy(wptr, "0123456789", 10);
+ buffer->commit(10);
+
+ auto* rptr = buffer->rptr(avail);
+ EXPECT_EQ(10, avail);
+ char tmp[11];
+ memcpy(tmp, rptr, 8);
+ tmp[8] = '\0';
+ EXPECT_STREQ("01234567", tmp);
+ buffer->consume(8);
+
+ wptr = buffer->wptr(avail, 3);
+ EXPECT_LE(3, avail);
+ memcpy(wptr, "abc", 3);
+ buffer->commit(3);
+
+ rptr = buffer->rptr(avail, 5);
+ EXPECT_EQ(5, avail);
+ memcpy(tmp, rptr, 5);
+ tmp[5] = '\0';
+ EXPECT_STREQ("89abc", tmp);
+ buffer->consume(5);
+}
+
+TEST_P(BufferTest, full) {
+ auto buffer = make(10, 10);
+ size_t avail;
+ auto* wptr = buffer->wptr(avail);
+ EXPECT_EQ(10, avail);
+ memcpy(wptr, "0123456789", 10);
+ buffer->commit(10);
+ EXPECT_TRUE(buffer->full());
+ std::ignore = buffer->wptr(avail);
+ EXPECT_EQ(0, avail);
+ buffer->commit(0);
+
+ auto* rptr = buffer->rptr(avail, 10);
+ EXPECT_EQ(10, avail);
+ char tmp[11];
+ memcpy(tmp, rptr, 5);
+ tmp[5] = '\0';
+ EXPECT_STREQ("01234", tmp);
+ buffer->consume(5);
+ EXPECT_FALSE(buffer->full());
+
+ wptr = buffer->wptr(avail, 5);
+ EXPECT_EQ(5, avail);
+ memcpy(wptr, "abcde", 5);
+ buffer->commit(5);
+ EXPECT_TRUE(buffer->full());
+
+ rptr = buffer->rptr(avail, 10);
+ EXPECT_EQ(10, avail);
+ memcpy(tmp, rptr, 10);
+ tmp[10] = '\0';
+ EXPECT_STREQ("56789abcde", tmp);
+ buffer->consume(10);
+ EXPECT_FALSE(buffer->full());
+ EXPECT_TRUE(buffer->empty());
+
+ std::ignore = buffer->rptr(avail, 10);
+ EXPECT_EQ(0, avail);
+ buffer->consume(0);
+}
+
+INSTANTIATE_TEST_SUITE_P(
+ AllTypes,
+ BufferTest,
+ testing::Values(BufferType::Fixed, BufferType::Dynamic));
+
+TEST(buffer, dynamic_increase) {
+ auto buffer = Buffer::dynamic(10, 20);
+
+ size_t avail;
+ auto* wptr = buffer->wptr(avail, 15);
+ EXPECT_EQ(15, avail);
+ memcpy(wptr, "0123456789abcde", 15);
+ buffer->commit(15);
+ EXPECT_FALSE(buffer->full());
+ wptr = buffer->wptr(avail, 5);
+ EXPECT_EQ(5, avail);
+ memcpy(wptr, "fghij", 5);
+ buffer->commit(5);
+ EXPECT_TRUE(buffer->full());
+
+ auto* rptr = buffer->rptr(avail, 20);
+ EXPECT_EQ(20, avail);
+ char tmp[21];
+ memcpy(tmp, rptr, 20);
+ tmp[20] = '\0';
+ EXPECT_STREQ("0123456789abcdefghij", tmp);
+ buffer->consume(20);
+ EXPECT_FALSE(buffer->full());
EXPECT_TRUE(buffer->empty());
}