zeek/auxil/broker/caf/libcaf_io/test/io/receive_buffer.cpp
Patrick Kelley 8fd444092b initial
2025-05-07 15:35:15 -04:00

165 lines
4.2 KiB
C++

// This file is part of CAF, the C++ Actor Framework. See the file LICENSE in
// the main distribution directory for license terms and copyright or visit
// https://github.com/actor-framework/actor-framework/blob/master/LICENSE.
#include "caf/config.hpp"
#define CAF_SUITE io_receive_buffer
#include "caf/test/unit_test.hpp"
#include <algorithm>
#include "caf/io/network/receive_buffer.hpp"
using namespace caf;
using caf::io::network::receive_buffer;
namespace {
struct fixture {
receive_buffer a;
receive_buffer b;
std::vector<char> vec;
fixture() : b(1024ul), vec{'h', 'a', 'l', 'l', 'o'} {
// nop
}
std::string as_string(const receive_buffer& xs) {
std::string result;
for (auto& x : xs)
result += static_cast<char>(x);
return result;
}
};
} // namespace
CAF_TEST_FIXTURE_SCOPE(receive_buffer_tests, fixture)
CAF_TEST(constructors) {
CAF_CHECK_EQUAL(a.size(), 0ul);
CAF_CHECK_EQUAL(a.capacity(), 0ul);
CAF_CHECK(a.data() == nullptr);
CAF_CHECK(a.empty());
CAF_CHECK_EQUAL(b.size(), 1024ul);
CAF_CHECK_EQUAL(b.capacity(), 1024ul);
CAF_CHECK(b.data() != nullptr);
CAF_CHECK(!b.empty());
receive_buffer other{std::move(b)};
CAF_CHECK_EQUAL(other.size(), 1024ul);
CAF_CHECK_EQUAL(other.capacity(), 1024ul);
CAF_CHECK(other.data() != nullptr);
CAF_CHECK(!other.empty());
}
CAF_TEST(reserve) {
a.reserve(0);
CAF_CHECK_EQUAL(a.size(), 0ul);
CAF_CHECK_EQUAL(a.capacity(), 0ul);
CAF_CHECK(a.data() == nullptr);
CAF_CHECK(a.empty());
a.reserve(1024);
CAF_CHECK_EQUAL(a.size(), 0ul);
CAF_CHECK_EQUAL(a.capacity(), 1024ul);
CAF_CHECK(a.data() != nullptr);
CAF_CHECK(a.begin() == a.end());
CAF_CHECK(a.empty());
a.reserve(512);
CAF_CHECK_EQUAL(a.size(), 0ul);
CAF_CHECK_EQUAL(a.capacity(), 1024ul);
CAF_CHECK(a.data() != nullptr);
CAF_CHECK(a.begin() == a.end());
CAF_CHECK(a.empty());
}
CAF_TEST(resize) {
a.resize(512);
CAF_CHECK_EQUAL(a.size(), 512ul);
CAF_CHECK_EQUAL(a.capacity(), 512ul);
CAF_CHECK(a.data() != nullptr);
CAF_CHECK(!a.empty());
b.resize(512);
CAF_CHECK_EQUAL(b.size(), 512ul);
CAF_CHECK_EQUAL(b.capacity(), 1024ul);
CAF_CHECK(b.data() != nullptr);
CAF_CHECK(!b.empty());
a.resize(1024);
std::fill(a.begin(), a.end(), 'a');
auto cnt = 0;
CAF_CHECK(std::all_of(a.begin(), a.end(), [&](char c) {
++cnt;
return c == 'a';
}));
CAF_CHECK_EQUAL(cnt, 1024);
a.resize(10);
cnt = 0;
CAF_CHECK(std::all_of(a.begin(), a.end(), [&](char c) {
++cnt;
return c == 'a';
}));
CAF_CHECK_EQUAL(cnt, 10);
a.resize(1024);
cnt = 0;
CAF_CHECK(std::all_of(a.begin(), a.end(), [&](char c) {
++cnt;
return c == 'a';
}));
CAF_CHECK_EQUAL(cnt, 1024);
}
CAF_TEST(push_back) {
for (auto c : vec)
a.push_back(c);
CAF_CHECK_EQUAL(vec.size(), a.size());
CAF_CHECK_EQUAL(a.capacity(), 8ul);
CAF_CHECK(a.data() != nullptr);
CAF_CHECK(!a.empty());
CAF_CHECK(std::equal(vec.begin(), vec.end(), a.begin()));
}
CAF_TEST(insert) {
for (auto c : vec)
a.insert(a.end(), c);
CAF_CHECK_EQUAL(as_string(a), "hallo");
a.insert(a.begin(), '!');
CAF_CHECK_EQUAL(as_string(a), "!hallo");
a.insert(a.begin() + 4, '-');
CAF_CHECK_EQUAL(as_string(a), "!hal-lo");
std::string foo = "foo:";
a.insert(a.begin() + 1, foo.begin(), foo.end());
CAF_CHECK_EQUAL(as_string(a), "!foo:hal-lo");
std::string bar = ":bar";
a.insert(a.end(), bar.begin(), bar.end());
CAF_CHECK_EQUAL(as_string(a), "!foo:hal-lo:bar");
}
CAF_TEST(shrink_to_fit) {
a.shrink_to_fit();
CAF_CHECK_EQUAL(a.size(), 0ul);
CAF_CHECK_EQUAL(a.capacity(), 0ul);
CAF_CHECK(a.data() == nullptr);
CAF_CHECK(a.empty());
}
CAF_TEST(swap) {
for (auto c : vec)
a.push_back(c);
std::swap(a, b);
CAF_CHECK_EQUAL(a.size(), 1024ul);
CAF_CHECK_EQUAL(a.capacity(), 1024ul);
CAF_CHECK(a.data() != nullptr);
CAF_CHECK_EQUAL(b.size(), vec.size());
CAF_CHECK_EQUAL(std::distance(b.begin(), b.end()),
static_cast<receive_buffer::difference_type>(vec.size()));
CAF_CHECK_EQUAL(b.capacity(), 8ul);
CAF_CHECK(b.data() != nullptr);
CAF_CHECK_EQUAL(*(b.data() + 0), 'h');
CAF_CHECK_EQUAL(*(b.data() + 1), 'a');
CAF_CHECK_EQUAL(*(b.data() + 2), 'l');
CAF_CHECK_EQUAL(*(b.data() + 3), 'l');
CAF_CHECK_EQUAL(*(b.data() + 4), 'o');
}
CAF_TEST_FIXTURE_SCOPE_END()