From 7c455009ba1bb6befed63fd80104257900a08220 Mon Sep 17 00:00:00 2001 From: ruben Date: Sat, 9 May 2020 19:43:04 +0100 Subject: [PATCH] Reduced code duplication in binary serialize test --- .../detail/protocol/binary_serialization.cpp | 22 ++------- .../protocol/serialization_test_common.cpp | 46 ++++++++++++------- .../protocol/serialization_test_common.hpp | 9 +++- 3 files changed, 41 insertions(+), 36 deletions(-) diff --git a/test/unit/detail/protocol/binary_serialization.cpp b/test/unit/detail/protocol/binary_serialization.cpp index f5ddff4f..0934164a 100644 --- a/test/unit/detail/protocol/binary_serialization.cpp +++ b/test/unit/detail/protocol/binary_serialization.cpp @@ -7,6 +7,7 @@ #include #include "test_common.hpp" +#include "serialization_test_common.hpp" #include "boost/mysql/detail/protocol/binary_serialization.hpp" using namespace boost::mysql::detail; @@ -42,7 +43,6 @@ struct SerializeBinaryValueTest : TestWithParam { }; -// TODO: these are copied from serialization tests TEST_P(SerializeBinaryValueTest, GetBinaryValueSize_Trivial_ReturnsExpectedSize) { serialization_context ctx (capabilities{}); @@ -52,23 +52,9 @@ TEST_P(SerializeBinaryValueTest, GetBinaryValueSize_Trivial_ReturnsExpectedSize) TEST_P(SerializeBinaryValueTest, SerializeBinaryValue_Trivial_WritesToBuffer) { - auto expected_size = GetParam().buffer.size(); - std::vector buffer (expected_size + 8, 0x7a); // buffer overrun detector - serialization_context ctx (capabilities(), buffer.data()); - serialize_binary_value(GetParam().from, ctx); - - // Iterator - EXPECT_EQ(ctx.first(), buffer.data() + expected_size) << "Iterator not updated correctly"; - - // Buffer - std::string_view expected_populated = makesv(GetParam().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"); + do_serialize_test(GetParam().buffer, [](serialization_context& ctx) { + serialize_binary_value(GetParam().from, ctx); + }); } diff --git a/test/unit/detail/protocol/serialization_test_common.cpp b/test/unit/detail/protocol/serialization_test_common.cpp index e43d53f1..8a12bf43 100644 --- a/test/unit/detail/protocol/serialization_test_common.cpp +++ b/test/unit/detail/protocol/serialization_test_common.cpp @@ -11,6 +11,32 @@ using namespace boost::mysql::detail; using namespace boost::mysql::test; using boost::mysql::errc; +void boost::mysql::test::do_serialize_test( + const std::vector& expected_buffer, + const std::function& serializator, + capabilities caps +) +{ + auto expected_size = expected_buffer.size(); + std::vector 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 { @@ -25,23 +51,9 @@ void get_size_test(const serialization_testcase& p) // serialize void serialize_test(const serialization_testcase& p) { - auto expected_size = p.expected_buffer.size(); - std::vector buffer (expected_size + 8, 0x7a); // buffer overrun detector - serialization_context ctx (p.caps, buffer.data()); - p.value->serialize(ctx); - - // Iterator - EXPECT_EQ(ctx.first(), buffer.data() + expected_size) << "Iterator not updated correctly"; - - // Buffer - std::string_view expected_populated = makesv(p.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"); + do_serialize_test(p.expected_buffer, [&](serialization_context& ctx) { + p.value->serialize(ctx); + }, p.caps); } // deserialize diff --git a/test/unit/detail/protocol/serialization_test_common.hpp b/test/unit/detail/protocol/serialization_test_common.hpp index b23c1204..05607503 100644 --- a/test/unit/detail/protocol/serialization_test_common.hpp +++ b/test/unit/detail/protocol/serialization_test_common.hpp @@ -14,6 +14,7 @@ #include #include #include +#include #include #include "test_common.hpp" @@ -166,7 +167,13 @@ struct serialization_testcase : test::named_param } }; - +// We expose this function so binary serialization, which does not employ +// the regular serialize() overloads, can use it +void do_serialize_test( + const std::vector& expected_buffer, + const std::function& serializator, + detail::capabilities caps = detail::capabilities() +); // Test fixtures struct SerializationFixture : public testing::TestWithParam {}; // base