Files
lix/tests/unit/libutil/io-buffer.cc
T
eldritch horrors 7d681a5049 libutil: add io buffer abstraction
the rpc transition will require sync and async objects to share a single
io buffer (since defining serializers on async is an immense pain in the
tail, slow, and ultimately not necessary). a generic buffer class allows
us to reuse existing serializers more readily (reuse them at all, even).

Change-Id: I5ebba8449f26f2bb76016818928183c7e0123be0
2025-06-11 18:11:57 +00:00

63 lines
1.7 KiB
C++

#include "lix/libutil/io-buffer.hh"
#include <gtest/gtest.h>
namespace nix {
TEST(IoBuffer, works)
{
IoBuffer buf{8};
// empty buffer doesn't return anything
ASSERT_EQ(buf.used(), 0);
ASSERT_EQ(buf.getReadBuffer().size(), 0);
// write a bit, it's no longer empty
ASSERT_EQ(buf.getWriteBuffer().size(), 8);
memcpy(buf.getWriteBuffer().data(), "test", 5);
buf.added(5);
// five bytes available now
ASSERT_EQ(buf.used(), 5);
ASSERT_EQ(buf.getReadBuffer().size(), 5);
ASSERT_STREQ(buf.getReadBuffer().data(), "test");
buf.consumed(5);
ASSERT_EQ(buf.used(), 0);
// write buffer resets to start of buffer when empty
ASSERT_EQ(buf.getWriteBuffer().size(), 8);
// not adding anything does nothing to the buffer
ASSERT_EQ(buf.used(), 0);
// buffer can wrap around the end, but in two segments
ASSERT_EQ(buf.getWriteBuffer().size(), 8);
memcpy(buf.getWriteBuffer().data(), "test", 5);
buf.added(5);
ASSERT_EQ(buf.getReadBuffer().size(), 5);
buf.consumed(4);
ASSERT_EQ(buf.getWriteBuffer().size(), 3);
memcpy(buf.getWriteBuffer().data(), "12", 3);
buf.added(3);
ASSERT_EQ(buf.getWriteBuffer().size(), 4);
memcpy(buf.getWriteBuffer().data(), "345", 4);
buf.added(4);
// reading now also happens in two chunks
ASSERT_EQ(buf.used(), 8);
ASSERT_EQ(buf.getReadBuffer().size(), 4);
ASSERT_STREQ(buf.getReadBuffer().data(), "");
buf.consumed(1);
ASSERT_STREQ(buf.getReadBuffer().data(), "12");
buf.consumed(3);
ASSERT_EQ(buf.used(), 4);
ASSERT_STREQ(buf.getReadBuffer().data(), "345");
buf.consumed(4);
// buffer is now empty again
ASSERT_EQ(buf.used(), 0);
ASSERT_EQ(buf.getWriteBuffer().size(), 8);
}
}