2
0
mirror of https://github.com/boostorg/mysql.git synced 2026-02-16 13:32:15 +00:00
Files
mysql/test/unit/detail/protocol/serialization_test_common.cpp

129 lines
4.4 KiB
C++

//
// Copyright (c) 2019-2020 Ruben Perez Hidalgo (rubenperez038 at gmail dot com)
//
// Distributed under the Boost Software License, Version 1.0. (See accompanying
// file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)
//
#include "serialization_test_common.hpp"
using namespace boost::mysql::detail;
using namespace boost::mysql::test;
using boost::mysql::errc;
void boost::mysql::test::do_serialize_test(
const std::vector<std::uint8_t>& expected_buffer,
const std::function<void(serialization_context&)>& serializator,
capabilities caps
)
{
auto expected_size = expected_buffer.size();
std::vector<uint8_t> buffer (expected_size + 8, 0x7a); // buffer overrun detector
serialization_context ctx (caps, buffer.data());
serializator(ctx);
// Iterator
EXPECT_EQ(ctx.first(), buffer.data() + expected_size) << "Iterator not updated correctly";
// Buffer
std::string_view expected_populated = makesv(expected_buffer.data(), expected_size);
std::string_view actual_populated = makesv(buffer.data(), expected_size);
compare_buffers(expected_populated, actual_populated, "Buffer contents incorrect");
// Check for buffer overruns
std::string expected_clean (8, 0x7a);
std::string_view actual_clean = makesv(buffer.data() + expected_size, 8);
compare_buffers(expected_clean, actual_clean, "Buffer overrun");
}
namespace
{
// Test bodies
void get_size_test(const serialization_testcase& p)
{
serialization_context ctx (p.caps, nullptr);
auto size = p.value->get_size(ctx);
EXPECT_EQ(size, p.expected_buffer.size());
}
// serialize
void serialize_test(const serialization_testcase& p)
{
do_serialize_test(p.expected_buffer, [&](serialization_context& ctx) {
p.value->serialize(ctx);
}, p.caps);
}
// deserialize
void deserialize_test(const serialization_testcase& p)
{
auto first = p.expected_buffer.data();
auto size = p.expected_buffer.size();
deserialization_context ctx (first, first + size, p.caps);
auto actual_value = p.value->default_construct();
auto err = actual_value->deserialize(ctx);
// No error
EXPECT_EQ(err, errc::ok);
// Iterator advanced
EXPECT_EQ(ctx.first(), first + size);
// Actual value
EXPECT_EQ(*actual_value, *p.value);
}
void deserialize_extra_space_test(const serialization_testcase& p)
{
std::vector<uint8_t> buffer (p.expected_buffer);
buffer.push_back(0xff);
auto first = buffer.data();
deserialization_context ctx (first, first + buffer.size(), p.caps);
auto actual_value = p.value->default_construct();
auto err = actual_value->deserialize(ctx);
// No error
EXPECT_EQ(err, errc::ok);
// Iterator advanced
EXPECT_EQ(ctx.first(), first + p.expected_buffer.size());
// Actual value
EXPECT_EQ(*actual_value, *p.value);
}
void deserialize_not_enough_space_test(const serialization_testcase& p)
{
std::vector<uint8_t> buffer (p.expected_buffer);
buffer.back() = 0x7a; // try to detect any overruns
deserialization_context ctx (buffer.data(), buffer.data() + buffer.size() - 1, p.caps);
auto actual_value = p.value->default_construct();
auto err = actual_value->deserialize(ctx);
EXPECT_EQ(err, errc::incomplete_message);
}
// Fixture test definition
TEST_P(SerializeTest, get_size) { get_size_test(GetParam()); }
TEST_P(SerializeTest, serialize) { serialize_test(GetParam()); }
TEST_P(DeserializeTest, deserialize) { deserialize_test(GetParam()); }
TEST_P(DeserializeSpaceTest, deserialize) { deserialize_test(GetParam()); }
TEST_P(DeserializeSpaceTest, deserialize_extra_space) { deserialize_extra_space_test(GetParam()); }
TEST_P(DeserializeSpaceTest, deserialize_not_enough_space) { deserialize_not_enough_space_test(GetParam()); }
TEST_P(SerializeDeserializeTest, get_size) { get_size_test(GetParam()); }
TEST_P(SerializeDeserializeTest, serialize) { serialize_test(GetParam()); }
TEST_P(SerializeDeserializeTest, deserialize) { deserialize_test(GetParam()); }
TEST_P(FullSerializationTest, get_size) { get_size_test(GetParam()); }
TEST_P(FullSerializationTest, serialize) { serialize_test(GetParam()); }
TEST_P(FullSerializationTest, deserialize) { deserialize_test(GetParam()); }
TEST_P(FullSerializationTest, deserialize_extra_space) { deserialize_extra_space_test(GetParam()); }
TEST_P(FullSerializationTest, deserialize_not_enough_space) { deserialize_not_enough_space_test(GetParam()); }
} // anon namespace