mirror of
https://github.com/zerotier/ZeroTierOne.git
synced 2024-12-30 17:56:57 +00:00
59 lines
1.8 KiB
C++
59 lines
1.8 KiB
C++
#include <iostream>
|
|
#include <sstream>
|
|
|
|
#include <pqxx/largeobject>
|
|
#include <pqxx/transaction>
|
|
|
|
#include "../test_helpers.hxx"
|
|
|
|
namespace
|
|
{
|
|
void test_stream_large_object()
|
|
{
|
|
pqxx::connection conn;
|
|
|
|
// Construct a really nasty string. (Don't just construct a std::string from
|
|
// a char[] constant, because it'll terminate at the embedded zero.)
|
|
//
|
|
// The crucial thing is the "ff" byte at the beginning. It tests for
|
|
// possible conflation between "eof" (-1) and a char which just happens to
|
|
// have the same bit pattern as an 8-bit value of -1. This conflation can be
|
|
// a problem when it occurs at buffer boundaries.
|
|
constexpr char bytes[]{"\xff\0end"};
|
|
std::string const contents{bytes, std::size(bytes)};
|
|
|
|
pqxx::work tx{conn};
|
|
#include "pqxx/internal/ignore-deprecated-pre.hxx"
|
|
pqxx::largeobject new_obj{tx};
|
|
|
|
pqxx::olostream write{tx, new_obj};
|
|
write << contents;
|
|
write.flush();
|
|
|
|
pqxx::largeobjectaccess check{tx, new_obj, std::ios::in | std::ios::binary};
|
|
std::array<char, 50> buf;
|
|
std::size_t const len{
|
|
static_cast<std::size_t>(check.read(std::data(buf), std::size(buf)))};
|
|
PQXX_CHECK_EQUAL(len, std::size(contents), "olostream truncated data.");
|
|
std::string const check_str{std::data(buf), len};
|
|
PQXX_CHECK_EQUAL(check_str, contents, "olostream mangled data.");
|
|
|
|
pqxx::ilostream read{tx, new_obj};
|
|
std::string read_back;
|
|
std::string chunk;
|
|
while (read >> chunk) read_back += chunk;
|
|
|
|
new_obj.remove(tx);
|
|
|
|
PQXX_CHECK_EQUAL(read_back, contents, "Got wrong data from ilostream.");
|
|
PQXX_CHECK_EQUAL(
|
|
std::size(read_back), std::size(contents), "ilostream truncated data.");
|
|
PQXX_CHECK_EQUAL(
|
|
std::size(read_back), std::size(bytes), "ilostream truncated data.");
|
|
#include "pqxx/internal/ignore-deprecated-post.hxx"
|
|
}
|
|
|
|
|
|
PQXX_REGISTER_TEST(test_stream_large_object);
|
|
} // namespace
|