From e3a067d32443c78c7876e9c65e0ec758dadf08fc Mon Sep 17 00:00:00 2001 From: ruben Date: Sun, 12 Jan 2020 14:17:10 +0000 Subject: [PATCH] Increased warning level Now examples and tests compile with more strict warning levels Now warnings are treated like errors Now test has its own CMakeLists.txt Solved several warnings --- CMakeLists.txt | 70 ++++--------------------- TODO.txt | 1 - examples/CMakeLists.txt | 1 + examples/query_async.cpp | 6 +-- include/mysql/impl/deserialize_row.ipp | 3 +- include/mysql/impl/serialization.hpp | 6 +-- test/CMakeLists.txt | 63 ++++++++++++++++++++++ test/channel.cpp | 4 +- test/deserialize_row.cpp | 2 +- test/integration/metadata_validator.cpp | 2 +- test/serialization.cpp | 3 +- test/serialization_test_common.hpp | 6 +-- test/value.cpp | 8 +-- 13 files changed, 94 insertions(+), 81 deletions(-) create mode 100644 test/CMakeLists.txt diff --git a/CMakeLists.txt b/CMakeLists.txt index 9083c1d0..4a2a255e 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -10,6 +10,14 @@ find_package(OpenSSL REQUIRED) set(CMAKE_CXX_STANDARD 17) enable_testing() +function (_mysql_set_target_warnings TARGET_NAME) + if(MSVC) + target_compile_options(${TARGET_NAME} PRIVATE /W4 /WX) + else() + target_compile_options(${TARGET_NAME} PRIVATE -Wall -Wextra -pedantic -Werror) + endif() +endfunction() + # Date FetchContent_Declare( date @@ -46,63 +54,5 @@ target_include_directories( # Examples add_subdirectory(examples) -# Unit testing -# TODO: build tests just when required -# TODO: fetch gtest and gmock -# TODO: is there a way of adding tests to ctest (like gtest_discover_tests) -# without runtime going nuts? -find_package(GTest REQUIRED) -find_library(GMOCK_LIBRARY gmock PATHS ${GTEST_ROOT}/lib) -add_executable( - unittests - test/serialization.cpp - test/channel.cpp - test/capabilities.cpp - test/auth.cpp - test/metadata.cpp - test/deserialize_row.cpp - test/value.cpp - test/row.cpp -) -target_include_directories( - unittests - PRIVATE - test/common -) -target_link_libraries( - unittests - PUBLIC - GTest::GTest - GTest::Main - ${GMOCK_LIBRARY} - mysql_asio -) -add_test( - NAME mysql_unittests - COMMAND ${CMAKE_CURRENT_BINARY_DIR}/unittests -) - -# Integration testing -add_executable( - integrationtests - test/integration/metadata_validator.cpp - test/integration/handshake.cpp - test/integration/query.cpp - test/integration/query_types.cpp -) -target_link_libraries( - integrationtests - PRIVATE - GTest::GTest - GTest::Main - mysql_asio -) -target_include_directories( - integrationtests - PRIVATE - test/common -) -add_test( - NAME mysql_integrationtests - COMMAND ${CMAKE_CURRENT_BINARY_DIR}/integrationtests -) +# Tests +add_subdirectory(test) diff --git a/TODO.txt b/TODO.txt index bab2c243..92fdefbe 100644 --- a/TODO.txt +++ b/TODO.txt @@ -4,7 +4,6 @@ MVP Compile with other g++ versions (find theoretical minimum) Add to readme Add travis - Merge master Sanitize cmake GTest/GMock to be downloaded Namespacing for the exported library (how does export work anyway?) diff --git a/examples/CMakeLists.txt b/examples/CMakeLists.txt index 6dc6fb01..886d9c81 100644 --- a/examples/CMakeLists.txt +++ b/examples/CMakeLists.txt @@ -9,6 +9,7 @@ function (_mysql_add_example EXECUTABLE_NAME CPPFILE) PRIVATE mysql_asio ) + _mysql_set_target_warnings(${EXECUTABLE_NAME}) endfunction() _mysql_add_example(example_query_sync query_sync.cpp) diff --git a/examples/query_async.cpp b/examples/query_async.cpp index f40c8366..3a354eea 100644 --- a/examples/query_async.cpp +++ b/examples/query_async.cpp @@ -44,9 +44,9 @@ class application mysql::tcp_connection connection; mysql::tcp_resultset resultset; public: - application(int argc, char** argv) : + application(const char* username, const char* password) : ep (boost::asio::ip::address_v4::loopback(), mysql::default_port), - conn_params(argv[1], argv[2], "mysql_asio_examples"), + conn_params(username, password, "mysql_asio_examples"), connection(ctx) { } @@ -117,7 +117,7 @@ void main_impl(int argc, char** argv) exit(1); } - application app (argc, argv); + application app (argv[1], argv[2]); app.start(); // starts the async chain app.context().run(); // run the asio::io_context until the async chain finishes } diff --git a/include/mysql/impl/deserialize_row.ipp b/include/mysql/impl/deserialize_row.ipp index 1e81cbc6..4b195cb1 100644 --- a/include/mysql/impl/deserialize_row.ipp +++ b/include/mysql/impl/deserialize_row.ipp @@ -77,7 +77,6 @@ inline Error deserialize_text_value_impl( { // Length check constexpr std::size_t min_size = 4 + 5*2 + 5; // year, month, day, hour, minute, seconds, separators - constexpr std::size_t max_size = min_size + 7; decimals = std::min(decimals, 6u); std::size_t expected_size = min_size + (decimals ? decimals + 1 : 0); if (from.size() != expected_size) return Error::protocol_value_error; @@ -237,4 +236,4 @@ mysql::error_code mysql::detail::deserialize_text_row( -#endif \ No newline at end of file +#endif diff --git a/include/mysql/impl/serialization.hpp b/include/mysql/impl/serialization.hpp index 7cff7a6b..968a1cd1 100644 --- a/include/mysql/impl/serialization.hpp +++ b/include/mysql/impl/serialization.hpp @@ -156,7 +156,7 @@ serialize(T input, SerializationContext& ctx) noexcept template constexpr std::enable_if_t, std::size_t> -get_size(T input, const SerializationContext&) noexcept +get_size(T, const SerializationContext&) noexcept { return get_fixed_size::value; } @@ -324,7 +324,7 @@ void serialize(T input, SerializationContext& ctx) noexcept } template >> -std::size_t get_size(T input, const SerializationContext&) noexcept +std::size_t get_size(T, const SerializationContext&) noexcept { return get_fixed_size>>::value; } @@ -454,4 +454,4 @@ Error deserialize_fields(DeserializationContext& ctx, FirstType& field, Types&.. } -#endif \ No newline at end of file +#endif diff --git a/test/CMakeLists.txt b/test/CMakeLists.txt new file mode 100644 index 00000000..b6024371 --- /dev/null +++ b/test/CMakeLists.txt @@ -0,0 +1,63 @@ + +# Unit testing +# TODO: build tests just when required +# TODO: fetch gtest and gmock +# TODO: is there a way of adding tests to ctest (like gtest_discover_tests) +# without runtime going nuts? +find_package(GTest REQUIRED) +find_library(GMOCK_LIBRARY gmock PATHS ${GTEST_ROOT}/lib) +add_executable( + unittests + serialization.cpp + channel.cpp + capabilities.cpp + auth.cpp + metadata.cpp + deserialize_row.cpp + value.cpp + row.cpp +) +target_include_directories( + unittests + PRIVATE + common +) +target_link_libraries( + unittests + PRIVATE + GTest::GTest + GTest::Main + ${GMOCK_LIBRARY} + mysql_asio +) +_mysql_set_target_warnings(unittests) +add_test( + NAME mysql_unittests + COMMAND ${CMAKE_CURRENT_BINARY_DIR}/unittests +) + +# Integration testing +add_executable( + integrationtests + integration/metadata_validator.cpp + integration/handshake.cpp + integration/query.cpp + integration/query_types.cpp +) +target_link_libraries( + integrationtests + PRIVATE + GTest::GTest + GTest::Main + mysql_asio +) +target_include_directories( + integrationtests + PRIVATE + common +) +_mysql_set_target_warnings(integrationtests) +add_test( + NAME mysql_integrationtests + COMMAND ${CMAKE_CURRENT_BINARY_DIR}/integrationtests +) \ No newline at end of file diff --git a/test/channel.cpp b/test/channel.cpp index 29d82571..c656f7ea 100644 --- a/test/channel.cpp +++ b/test/channel.cpp @@ -132,7 +132,7 @@ struct MysqlChannelReadTest : public MysqlChannelFixture static auto read_failer(error_code error) { - return [error](boost::asio::mutable_buffer b, mysql::error_code& ec) { + return [error](boost::asio::mutable_buffer, mysql::error_code& ec) { ec = error; return size_t(0); }; @@ -248,7 +248,7 @@ struct MysqlChannelWriteTest : public MysqlChannelFixture static auto write_failer(errc::errc_t error) { - return [error](boost::asio::const_buffer buff, error_code& ec) { + return [error](boost::asio::const_buffer, error_code& ec) { ec = errc::make_error_code(error); return 0; }; diff --git a/test/deserialize_row.cpp b/test/deserialize_row.cpp index 69b57dcf..fca3328f 100644 --- a/test/deserialize_row.cpp +++ b/test/deserialize_row.cpp @@ -44,7 +44,7 @@ struct TextValueParam decimals(decimals), flags(flags) { - }; + } }; std::ostream& operator<<(std::ostream& os, const TextValueParam& value) { return os << value.name; } diff --git a/test/integration/metadata_validator.cpp b/test/integration/metadata_validator.cpp index 5a825fbc..d5464d14 100644 --- a/test/integration/metadata_validator.cpp +++ b/test/integration/metadata_validator.cpp @@ -70,7 +70,7 @@ void mysql::test::validate_meta( ) { ASSERT_EQ(actual.size(), expected.size()); - for (int i = 0; i < actual.size(); ++i) + for (std::size_t i = 0; i < actual.size(); ++i) { expected[i].validate(actual[i]); } diff --git a/test/serialization.cpp b/test/serialization.cpp index 6b4d3982..f6508fd6 100644 --- a/test/serialization.cpp +++ b/test/serialization.cpp @@ -286,7 +286,8 @@ INSTANTIATE_TEST_SUITE_P(Handhsake, DeserializeSpaceTest, ::testing::Values( {hanshake_caps}, static_cast(collation::latin1_swedish_ci), { SERVER_STATUS_AUTOCOMMIT }, - { "mysql_native_password" } + { "mysql_native_password" }, + {} // data buffer; internal, not used in the comparisons for correctness }, { 0x35, 0x2e, 0x37, 0x2e, 0x32, 0x37, 0x2d, 0x30, 0x75, 0x62, 0x75, 0x6e, 0x74, 0x75, 0x30, 0x2e, diff --git a/test/serialization_test_common.hpp b/test/serialization_test_common.hpp index 2ded6b94..9547da13 100644 --- a/test/serialization_test_common.hpp +++ b/test/serialization_test_common.hpp @@ -186,7 +186,7 @@ struct SerializationFixture : public testing::TestWithParam void serialize_test() { auto expected_size = GetParam().expected_buffer.size(); - std::vector buffer (expected_size + 8, 0xaa); // buffer overrun detector + std::vector buffer (expected_size + 8, 0x7a); // buffer overrun detector SerializationContext ctx (GetParam().caps, buffer.data()); GetParam().value->serialize(ctx); @@ -199,7 +199,7 @@ struct SerializationFixture : public testing::TestWithParam EXPECT_EQ(expected_populated, actual_populated) << "Buffer contents incorrect"; // Check for buffer overruns - std::string expected_clean (8, 0xaa); + std::string expected_clean (8, 0x7a); std::string_view actual_clean = make_buffer_view(buffer.data() + expected_size, 8); EXPECT_EQ(expected_clean, actual_clean) << "Buffer overrun"; } @@ -245,7 +245,7 @@ struct SerializationFixture : public testing::TestWithParam void deserialize_not_enough_space_test() { std::vector buffer (GetParam().expected_buffer); - buffer.back() = 0xaa; // try to detect any overruns + buffer.back() = 0x7a; // try to detect any overruns DeserializationContext ctx (buffer.data(), buffer.data() + buffer.size() - 1, GetParam().caps); auto actual_value = GetParam().value->default_construct(); auto err = actual_value->deserialize(ctx); diff --git a/test/value.cpp b/test/value.cpp index 1d5866a8..91b47a63 100644 --- a/test/value.cpp +++ b/test/value.cpp @@ -56,9 +56,9 @@ struct ValueEqualityTest : public Test TEST_F(ValueEqualityTest, OperatorsEqNe_DifferentType_ReturnNotEquals) { - for (int i = 0; i < values.size(); ++i) + for (std::size_t i = 0; i < values.size(); ++i) { - for (int j = 0; j < i; ++j) + for (std::size_t j = 0; j < i; ++j) { EXPECT_FALSE(values.at(i) == values.at(j)) << "i=" << i << ", j=" << j; EXPECT_TRUE(values.at(i) != values.at(j)) << "i=" << i << ", j=" << j; @@ -70,7 +70,7 @@ TEST_F(ValueEqualityTest, OperatorsEqNe_SameTypeDifferentValue_ReturnNotEquals) { // Note: nullptr_t (the last value) can't have other value than nullptr // so it is excluded from this test - for (int i = 0; i < values.size() - 1; ++i) + for (std::size_t i = 0; i < values.size() - 1; ++i) { EXPECT_FALSE(values.at(i) == other_values.at(i)) << "i=" << i; EXPECT_TRUE(values.at(i) != other_values.at(i)) << "i=" << i; @@ -79,7 +79,7 @@ TEST_F(ValueEqualityTest, OperatorsEqNe_SameTypeDifferentValue_ReturnNotEquals) TEST_F(ValueEqualityTest, OperatorsEqNe_SameTypeSameValue_ReturnEquals) { - for (int i = 0; i < values.size(); ++i) + for (std::size_t i = 0; i < values.size(); ++i) { EXPECT_TRUE(values.at(i) == values_copy.at(i)) << "i=" << i; EXPECT_FALSE(values.at(i) != values_copy.at(i)) << "i=" << i;