From 805b655e35f954e0a9ca9ba549f903c6bdabbf4c Mon Sep 17 00:00:00 2001 From: ruben Date: Wed, 15 Apr 2020 16:31:26 +0100 Subject: [PATCH] Refactored network test functionality --- TODO.txt | 4 - test/integration/close_statement.cpp | 4 +- test/integration/database_types.cpp | 10 +- test/integration/execute_statement.cpp | 23 +-- test/integration/handshake.cpp | 57 +++---- test/integration/integration_test_common.hpp | 155 +++++++++++------- test/integration/network_functions.hpp | 27 +++ test/integration/prepare_statement.cpp | 8 +- .../prepared_statement_lifecycle.cpp | 12 +- test/integration/query.cpp | 14 +- test/integration/resultset.cpp | 152 ++++++++--------- 11 files changed, 254 insertions(+), 212 deletions(-) diff --git a/TODO.txt b/TODO.txt index d8b5a6b8..7948726a 100644 --- a/TODO.txt +++ b/TODO.txt @@ -1,8 +1,4 @@ UNIX socket - Test suite for UNIX sockets - Rework names to be BOOST_ and not NETWORK_ - Unify test name generators - Conditionally build/run stuff for UNIX sockets Config files for CIs to know where UNIX socket is Docs Example in docs diff --git a/test/integration/close_statement.cpp b/test/integration/close_statement.cpp index 14fef0b9..7dbd2fc4 100644 --- a/test/integration/close_statement.cpp +++ b/test/integration/close_statement.cpp @@ -44,8 +44,8 @@ struct CloseStatementTest : NetworkTest } }; -MYSQL_NETWORK_TEST_SUITE2(CloseStatementTest) -MYSQL_NETWORK_TEST(CloseStatementTest, ExistingOrClosedStatement) +BOOST_MYSQL_NETWORK_TEST_SUITE(CloseStatementTest) +BOOST_MYSQL_NETWORK_TEST(CloseStatementTest, ExistingOrClosedStatement) } diff --git a/test/integration/database_types.cpp b/test/integration/database_types.cpp index 54313427..1195cc21 100644 --- a/test/integration/database_types.cpp +++ b/test/integration/database_types.cpp @@ -55,10 +55,14 @@ std::ostream& operator<<(std::ostream& os, const database_types_testcase& v) return os << v.table << "." << v.field << "." << v.row_id; } -struct DatabaseTypesTest : IntegTestAfterHandshake, - WithParamInterface +// Note: NetworkTest with do_handshake=true requires GetParam() to have an ssl data member +struct DatabaseTypesTest : + NetworkTest { - DatabaseTypesTest(): IntegTestAfterHandshake(boost::mysql::ssl_mode::disable) {} + DatabaseTypesTest() + { + handshake(boost::mysql::ssl_mode::disable); + } }; TEST_P(DatabaseTypesTest, Query_MetadataAndValueCorrect) diff --git a/test/integration/execute_statement.cpp b/test/integration/execute_statement.cpp index 3c9b2977..fac6d3ed 100644 --- a/test/integration/execute_statement.cpp +++ b/test/integration/execute_statement.cpp @@ -111,21 +111,24 @@ struct ExecuteStatementTest : public NetworkTest } }; -MYSQL_NETWORK_TEST_SUITE2(ExecuteStatementTest); +BOOST_MYSQL_NETWORK_TEST_SUITE(ExecuteStatementTest); -MYSQL_NETWORK_TEST(ExecuteStatementTest, Iterator_OkNoParams) -MYSQL_NETWORK_TEST(ExecuteStatementTest, Iterator_OkWithParams) -MYSQL_NETWORK_TEST(ExecuteStatementTest, Iterator_MismatchedNumParams) -MYSQL_NETWORK_TEST(ExecuteStatementTest, Iterator_ServerError) -MYSQL_NETWORK_TEST(ExecuteStatementTest, Container_OkNoParams) -MYSQL_NETWORK_TEST(ExecuteStatementTest, Container_OkWithParams) -MYSQL_NETWORK_TEST(ExecuteStatementTest, Container_MismatchedNumParams) -MYSQL_NETWORK_TEST(ExecuteStatementTest, Container_ServerError) +BOOST_MYSQL_NETWORK_TEST(ExecuteStatementTest, Iterator_OkNoParams) +BOOST_MYSQL_NETWORK_TEST(ExecuteStatementTest, Iterator_OkWithParams) +BOOST_MYSQL_NETWORK_TEST(ExecuteStatementTest, Iterator_MismatchedNumParams) +BOOST_MYSQL_NETWORK_TEST(ExecuteStatementTest, Iterator_ServerError) +BOOST_MYSQL_NETWORK_TEST(ExecuteStatementTest, Container_OkNoParams) +BOOST_MYSQL_NETWORK_TEST(ExecuteStatementTest, Container_OkWithParams) +BOOST_MYSQL_NETWORK_TEST(ExecuteStatementTest, Container_MismatchedNumParams) +BOOST_MYSQL_NETWORK_TEST(ExecuteStatementTest, Container_ServerError) // Other containers -struct ExecuteStatementOtherContainersTest : IntegTestAfterHandshake {}; +struct ExecuteStatementOtherContainersTest : IntegTest +{ + ExecuteStatementOtherContainersTest() { handshake(boost::mysql::ssl_mode::disable); } +}; TEST_F(ExecuteStatementOtherContainersTest, NoParams_CanUseNoStatementParamsVariable) { diff --git a/test/integration/handshake.cpp b/test/integration/handshake.cpp index ce8df8ba..0032e343 100644 --- a/test/integration/handshake.cpp +++ b/test/integration/handshake.cpp @@ -31,8 +31,8 @@ namespace // Handshake tests not depending on whether we use SSL or not template -struct SslIndifferentHandshakeTest : public IntegTest, - public testing::WithParamInterface> +struct SslIndifferentHandshakeTest : + NetworkTest, false> { auto do_handshake() { @@ -50,8 +50,7 @@ struct SslIndifferentHandshakeTest : public IntegTest, }; template -struct SslSensitiveHandshakeTest : public IntegTest, - public testing::WithParamInterface*> +struct SslSensitiveHandshakeTest : NetworkTest, false> { void set_ssl(ssl_mode m) { @@ -60,7 +59,7 @@ struct SslSensitiveHandshakeTest : public IntegTest, auto do_handshake() { - return this->GetParam()->handshake(this->conn, this->connection_params); + return this->GetParam().net->handshake(this->conn, this->connection_params); } void do_handshake_ok(ssl_mode m) @@ -96,11 +95,11 @@ struct MysqlNativePasswordHandshakeTest : SslIndifferentHandshakeTest } }; -MYSQL_NETWORK_TEST_SUITE2(MysqlNativePasswordHandshakeTest); +BOOST_MYSQL_NETWORK_TEST_SUITE(MysqlNativePasswordHandshakeTest); -MYSQL_NETWORK_TEST(MysqlNativePasswordHandshakeTest, RegularUser_SuccessfulLogin) -MYSQL_NETWORK_TEST(MysqlNativePasswordHandshakeTest, EmptyPassword_SuccessfulLogin) -MYSQL_NETWORK_TEST(MysqlNativePasswordHandshakeTest, BadPassword_FailedLogin) +BOOST_MYSQL_NETWORK_TEST(MysqlNativePasswordHandshakeTest, RegularUser_SuccessfulLogin) +BOOST_MYSQL_NETWORK_TEST(MysqlNativePasswordHandshakeTest, EmptyPassword_SuccessfulLogin) +BOOST_MYSQL_NETWORK_TEST(MysqlNativePasswordHandshakeTest, BadPassword_FailedLogin) // Other handshake tests not depending on SSL mode @@ -129,11 +128,11 @@ struct MiscSslIndifferentHandshakeTest : SslIndifferentHandshakeTest } }; -MYSQL_NETWORK_TEST_SUITE2(MiscSslIndifferentHandshakeTest); +BOOST_MYSQL_NETWORK_TEST_SUITE(MiscSslIndifferentHandshakeTest); -MYSQL_NETWORK_TEST(MiscSslIndifferentHandshakeTest, NoDatabase_SuccessfulLogin) -MYSQL_NETWORK_TEST(MiscSslIndifferentHandshakeTest, BadDatabase_FailedLogin) -MYSQL_NETWORK_TEST(MiscSslIndifferentHandshakeTest, UnknownAuthPlugin_FailedLogin_RequiresSha256) +BOOST_MYSQL_NETWORK_TEST(MiscSslIndifferentHandshakeTest, NoDatabase_SuccessfulLogin) +BOOST_MYSQL_NETWORK_TEST(MiscSslIndifferentHandshakeTest, BadDatabase_FailedLogin) +BOOST_MYSQL_NETWORK_TEST(MiscSslIndifferentHandshakeTest, UnknownAuthPlugin_FailedLogin_RequiresSha256) // caching_sha2_password template @@ -239,20 +238,18 @@ struct CachingSha2HandshakeTest : SslSensitiveHandshakeTest } }; -BOOST_MYSQL_NETWORK_TEST_SUITE_TYPEDEFS(CachingSha2HandshakeTest); +BOOST_MYSQL_NETWORK_TEST_SUITE(CachingSha2HandshakeTest); -MYSQL_NETWORK_TEST(CachingSha2HandshakeTest, SslOnCacheHit_SuccessfulLogin_RequiresSha256) -MYSQL_NETWORK_TEST(CachingSha2HandshakeTest, SslOffCacheHit_SuccessfulLogin_RequiresSha256) -MYSQL_NETWORK_TEST(CachingSha2HandshakeTest, SslOnCacheMiss_SuccessfulLogin_RequiresSha256) -MYSQL_NETWORK_TEST(CachingSha2HandshakeTest, SslOffCacheMiss_FailedLogin_RequiresSha256) -MYSQL_NETWORK_TEST(CachingSha2HandshakeTest, EmptyPasswordSslOnCacheHit_SuccessfulLogin_RequiresSha256) -MYSQL_NETWORK_TEST(CachingSha2HandshakeTest, EmptyPasswordSslOffCacheHit_SuccessfulLogin_RequiresSha256) -MYSQL_NETWORK_TEST(CachingSha2HandshakeTest, EmptyPasswordSslOnCacheMiss_SuccessfulLogin_RequiresSha256) -MYSQL_NETWORK_TEST(CachingSha2HandshakeTest, EmptyPasswordSslOffCacheMiss_SuccessfulLogin_RequiresSha256) -MYSQL_NETWORK_TEST(CachingSha2HandshakeTest, BadPasswordSslOnCacheMiss_FailedLogin_RequiresSha256) -MYSQL_NETWORK_TEST(CachingSha2HandshakeTest, BadPasswordSslOnCacheHit_FailedLogin_RequiresSha256) - -BOOST_MYSQL_INSTANTIATE_NETWORK_TEST_SUITE(CachingSha2HandshakeTest, make_all_network_functions); +BOOST_MYSQL_NETWORK_TEST(CachingSha2HandshakeTest, SslOnCacheHit_SuccessfulLogin_RequiresSha256) +BOOST_MYSQL_NETWORK_TEST(CachingSha2HandshakeTest, SslOffCacheHit_SuccessfulLogin_RequiresSha256) +BOOST_MYSQL_NETWORK_TEST(CachingSha2HandshakeTest, SslOnCacheMiss_SuccessfulLogin_RequiresSha256) +BOOST_MYSQL_NETWORK_TEST(CachingSha2HandshakeTest, SslOffCacheMiss_FailedLogin_RequiresSha256) +BOOST_MYSQL_NETWORK_TEST(CachingSha2HandshakeTest, EmptyPasswordSslOnCacheHit_SuccessfulLogin_RequiresSha256) +BOOST_MYSQL_NETWORK_TEST(CachingSha2HandshakeTest, EmptyPasswordSslOffCacheHit_SuccessfulLogin_RequiresSha256) +BOOST_MYSQL_NETWORK_TEST(CachingSha2HandshakeTest, EmptyPasswordSslOnCacheMiss_SuccessfulLogin_RequiresSha256) +BOOST_MYSQL_NETWORK_TEST(CachingSha2HandshakeTest, EmptyPasswordSslOffCacheMiss_SuccessfulLogin_RequiresSha256) +BOOST_MYSQL_NETWORK_TEST(CachingSha2HandshakeTest, BadPasswordSslOnCacheMiss_FailedLogin_RequiresSha256) +BOOST_MYSQL_NETWORK_TEST(CachingSha2HandshakeTest, BadPasswordSslOnCacheHit_FailedLogin_RequiresSha256) // Misc tests that are sensitive on SSL template @@ -277,11 +274,9 @@ struct MiscSslSensitiveHandshakeTest : SslSensitiveHandshakeTest } }; -BOOST_MYSQL_NETWORK_TEST_SUITE_TYPEDEFS(MiscSslSensitiveHandshakeTest); +BOOST_MYSQL_NETWORK_TEST_SUITE(MiscSslSensitiveHandshakeTest); -MYSQL_NETWORK_TEST(MiscSslSensitiveHandshakeTest, BadUser_FailedLogin) -MYSQL_NETWORK_TEST(MiscSslSensitiveHandshakeTest, SslEnable_SuccessfulLogin) - -BOOST_MYSQL_INSTANTIATE_NETWORK_TEST_SUITE(MiscSslSensitiveHandshakeTest, make_all_network_functions) +BOOST_MYSQL_NETWORK_TEST(MiscSslSensitiveHandshakeTest, BadUser_FailedLogin) +BOOST_MYSQL_NETWORK_TEST(MiscSslSensitiveHandshakeTest, SslEnable_SuccessfulLogin) } // anon namespace diff --git a/test/integration/integration_test_common.hpp b/test/integration/integration_test_common.hpp index 84b377b3..2a36897e 100644 --- a/test/integration/integration_test_common.hpp +++ b/test/integration/integration_test_common.hpp @@ -31,6 +31,15 @@ inline void physical_connect(unix_connection& conn) } #endif +/** + * The base of all integration tests. The fixture constructor creates + * a connection, an asio io_context and a thread to run it. It also + * performs the physical connect on the connection's underlying stream. + * + * The fixture is template-parameterized by a stream type, so that + * tests can be run using several stream types. For a new stream type, + * define a physical_connect() function applicable to that stream. + */ template struct IntegTest : testing::Test { @@ -133,64 +142,94 @@ struct IntegTest : testing::Test }; -template -struct IntegTestAfterHandshake : IntegTest -{ - IntegTestAfterHandshake(ssl_mode m = ssl_mode::require) { this->handshake(m); } -}; - +// To be used as test parameter, when a test case should be run +// over all different network_function's. template struct network_testcase +{ + network_functions* net; + + std::string name() const { return net->name(); } + + static std::vector> make_all() + { + std::vector> res; + for (auto* net: make_all_network_functions()) + { + res.push_back(network_testcase{net}); + } + return res; + } +}; + +// To be used as test parameter, when a test should be run over +// all network_function's and ssl_mode's +template +struct network_testcase_with_ssl { network_functions* net; ssl_mode ssl; std::string name() const { - return detail::stringize(net->name(), '_', to_string(ssl)); + return detail::stringize(this->net->name(), '_', to_string(ssl)); + } + + static std::vector> make_all() + { + std::vector> res; + for (auto* net: make_all_network_functions()) + { + for (auto ssl: {ssl_mode::require, ssl_mode::disable}) + { + res.push_back(network_testcase_with_ssl{net, ssl}); + } + } + return res; } }; -template -inline std::vector> make_all_network_testcases() +/** + * The base class for tests to be run over multiple stream types + * and multiple parameters (typically network_function's and ssl_mode's). + * + * To define test cases, please do: + * 1. Select a (possibly template) test parameter (e.g. network_testcase_with_ssl). + * The test parameter should have a std::string name() method, and a static + * std::vector make_all() method, that returns a vector with + * all test parameters to use. + * 2. Declare a test fixture, as a struct inheriting from NetworkTest. It should be + * a template, parameterized just by the stream type. + * 3. Define the tests, as methods of the fixture. They should have void() signature. + * 4. Use BOOST_MYSQL_NETWORK_TEST_SUITE(FixtureName) to instantiate the test suite. + * This will create as many suites as stream types officially supported, and call + * INSTANTIATE_TEST_SUITE_P. For example, for a test suite MySuite, it may generate + * suites MySuiteTCP and MySuiteUNIX, for TCP and UNIX sockets. + * 5. Use BOOST_MYSQL_NETWORK_TEST(FixtureName, TestName) for each test you defined + * as method of the fixture. This will call TEST_P once for each supported stream, + * calling the method you defined in the fixture. + */ +template < + typename Stream, + typename Param=network_testcase_with_ssl, + bool do_handshake=true +> +struct NetworkTest : public IntegTest, + public testing::WithParamInterface { - std::vector> res; - for (auto* net: make_all_network_functions()) + NetworkTest() { - for (auto ssl: {ssl_mode::require, ssl_mode::disable}) + if constexpr (do_handshake) { - res.push_back(network_testcase{net, ssl}); + this->handshake(this->GetParam().ssl); } } - return res; -} - -template -struct NetworkTest : public IntegTestAfterHandshake, - public testing::WithParamInterface> -{ - NetworkTest(): IntegTestAfterHandshake(NetworkTest::GetParam().ssl) {} -}; - -struct universal_name_generator -{ - template >> - std::string operator()(const T& v) const { return v.name(); } - - template - std::string operator()(const T* v) const { return v->name(); } }; } // test } // mysql } // boost -// Old -#define MYSQL_NETWORK_TEST_SUITE(TestSuiteName) \ - INSTANTIATE_TEST_SUITE_P(Default, TestSuiteName, testing::ValuesIn( \ - make_all_network_testcases() \ - ), [](const auto& param_info) { return param_info.param.name(); }) - // Typedefs #define BOOST_MYSQL_NETWORK_TEST_SUITE_TYPEDEFS_HELPER(TestSuiteName, Suffix, Stream) \ using TestSuiteName##Suffix = TestSuiteName; @@ -210,49 +249,49 @@ struct universal_name_generator BOOST_MYSQL_NETWORK_TEST_SUITE_TYPEDEFS_UNIX(TestSuiteName) // Test definition -#define MYSQL_NETWORK_TEST_HELPER(TestSuiteName, TestName, Suffix) \ +#define BOOST_MYSQL_NETWORK_TEST_HELPER(TestSuiteName, TestName, Suffix) \ TEST_P(TestSuiteName##Suffix, TestName) { this->TestName(); } -#define MYSQL_NETWORK_TEST_TCP(TestSuiteName, TestName) \ - MYSQL_NETWORK_TEST_HELPER(TestSuiteName, TestName, TCP) +#define BOOST_MYSQL_NETWORK_TEST_TCP(TestSuiteName, TestName) \ + BOOST_MYSQL_NETWORK_TEST_HELPER(TestSuiteName, TestName, TCP) #ifdef BOOST_ASIO_HAS_LOCAL_SOCKETS -#define MYSQL_NETWORK_TEST_UNIX(TestSuiteName, TestName) \ - MYSQL_NETWORK_TEST_HELPER(TestSuiteName, TestName, UNIX) +#define BOOST_MYSQL_NETWORK_TEST_UNIX(TestSuiteName, TestName) \ + BOOST_MYSQL_NETWORK_TEST_HELPER(TestSuiteName, TestName, UNIX) #else -#define MYSQL_NETWORK_TEST_UNIX(TestSuiteName, TestName) +#define BOOST_MYSQL_NETWORK_TEST_UNIX(TestSuiteName, TestName) #endif -#define MYSQL_NETWORK_TEST(TestSuiteName, TestName) \ - MYSQL_NETWORK_TEST_TCP(TestSuiteName, TestName) \ - MYSQL_NETWORK_TEST_UNIX(TestSuiteName, TestName) +#define BOOST_MYSQL_NETWORK_TEST(TestSuiteName, TestName) \ + BOOST_MYSQL_NETWORK_TEST_TCP(TestSuiteName, TestName) \ + BOOST_MYSQL_NETWORK_TEST_UNIX(TestSuiteName, TestName) // Test suite instantiation -#define BOOST_MYSQL_INSTANTIATE_NETWORK_TEST_SUITE_HELPER(TestSuiteName, Generator, Suffix) \ +#define BOOST_MYSQL_INSTANTIATE_NETWORK_TEST_SUITE_HELPER(TestSuiteName, Suffix) \ INSTANTIATE_TEST_SUITE_P(Default, TestSuiteName##Suffix, testing::ValuesIn( \ - Generator() \ + TestSuiteName##Suffix::ParamType::make_all() \ ), [](const auto& param_info) { \ - return ::boost::mysql::test::universal_name_generator()(param_info.param); \ + return param_info.param.name(); \ }); -#define BOOST_MYSQL_INSTANTIATE_NETWORK_TEST_SUITE_TCP(TestSuiteName, Generator) \ - BOOST_MYSQL_INSTANTIATE_NETWORK_TEST_SUITE_HELPER(TestSuiteName, Generator, TCP) +#define BOOST_MYSQL_INSTANTIATE_NETWORK_TEST_SUITE_TCP(TestSuiteName) \ + BOOST_MYSQL_INSTANTIATE_NETWORK_TEST_SUITE_HELPER(TestSuiteName, TCP) #ifdef BOOST_ASIO_HAS_LOCAL_SOCKETS -#define BOOST_MYSQL_INSTANTIATE_NETWORK_TEST_SUITE_UNIX(TestSuiteName, Generator) \ - BOOST_MYSQL_INSTANTIATE_NETWORK_TEST_SUITE_HELPER(TestSuiteName, Generator, UNIX) +#define BOOST_MYSQL_INSTANTIATE_NETWORK_TEST_SUITE_UNIX(TestSuiteName) \ + BOOST_MYSQL_INSTANTIATE_NETWORK_TEST_SUITE_HELPER(TestSuiteName, UNIX) #else -#define BOOST_MYSQL_INSTANTIATE_NETWORK_TEST_SUITE_UNIX(TestSuiteName, Generator) +#define BOOST_MYSQL_INSTANTIATE_NETWORK_TEST_SUITE_UNIX(TestSuiteName) #endif -#define BOOST_MYSQL_INSTANTIATE_NETWORK_TEST_SUITE(TestSuiteName, Generator) \ - BOOST_MYSQL_INSTANTIATE_NETWORK_TEST_SUITE_TCP(TestSuiteName, Generator) \ - BOOST_MYSQL_INSTANTIATE_NETWORK_TEST_SUITE_UNIX(TestSuiteName, Generator) +#define BOOST_MYSQL_INSTANTIATE_NETWORK_TEST_SUITE(TestSuiteName) \ + BOOST_MYSQL_INSTANTIATE_NETWORK_TEST_SUITE_TCP(TestSuiteName) \ + BOOST_MYSQL_INSTANTIATE_NETWORK_TEST_SUITE_UNIX(TestSuiteName) // Typedefs + Instantiation -#define MYSQL_NETWORK_TEST_SUITE2(TestSuiteName) \ +#define BOOST_MYSQL_NETWORK_TEST_SUITE(TestSuiteName) \ BOOST_MYSQL_NETWORK_TEST_SUITE_TYPEDEFS(TestSuiteName) \ - BOOST_MYSQL_INSTANTIATE_NETWORK_TEST_SUITE(TestSuiteName, make_all_network_testcases) + BOOST_MYSQL_INSTANTIATE_NETWORK_TEST_SUITE(TestSuiteName) diff --git a/test/integration/network_functions.hpp b/test/integration/network_functions.hpp index 46819952..21e56f3c 100644 --- a/test/integration/network_functions.hpp +++ b/test/integration/network_functions.hpp @@ -7,6 +7,33 @@ #include #include +/** + * A mechanism to test all variants of a network algorithm (e.g. synchronous + * with exceptions, asynchronous with coroutines...) without writing + * the same test several times. + * + * All network algorithm variants are transformed to a single one: a synchronous + * one, returning a network_result. A network_result contains a T, an error_code + * and an error_info. network_functions is an interface, which each variant implements. + * Instead of directly calling connection, prepared_statement and resultset network + * functions directly, tests use the network_functions interface. Tests are then + * parameterized (e.g. TEST_P) and run over all possible implementations of + * network_functions. + * + * To make things more interesting, network_functions interface is also a template, + * allowing tests to be run over different stream types (e.g. TCP, UNIX sockets...). + * Use BOOST_MYSQL_NETWORK_TEST* macros and NetworkTest to achieve this. + * + * The following variants are currently supported: + * - Synchronous with error codes. + * - Synchronous with exceptions. + * - Asynchronous, with callbacks, with error_info. + * - Asynchronous, with callbacks, without error_info. + * - Asynchronous, with coroutines, with error_info. + * - Asynchronous, with coroutines, without error_info. + * - Asynchronous, with futures. + */ + namespace boost { namespace mysql { namespace test { diff --git a/test/integration/prepare_statement.cpp b/test/integration/prepare_statement.cpp index 91d4498f..b210fd6f 100644 --- a/test/integration/prepare_statement.cpp +++ b/test/integration/prepare_statement.cpp @@ -51,11 +51,11 @@ struct PrepareStatementTest : public NetworkTest } }; -MYSQL_NETWORK_TEST_SUITE2(PrepareStatementTest); +BOOST_MYSQL_NETWORK_TEST_SUITE(PrepareStatementTest); -MYSQL_NETWORK_TEST(PrepareStatementTest, OkNoParams) -MYSQL_NETWORK_TEST(PrepareStatementTest, OkWithParams) -MYSQL_NETWORK_TEST(PrepareStatementTest, InvalidStatement) +BOOST_MYSQL_NETWORK_TEST(PrepareStatementTest, OkNoParams) +BOOST_MYSQL_NETWORK_TEST(PrepareStatementTest, OkWithParams) +BOOST_MYSQL_NETWORK_TEST(PrepareStatementTest, InvalidStatement) } diff --git a/test/integration/prepared_statement_lifecycle.cpp b/test/integration/prepared_statement_lifecycle.cpp index 631c117e..1c32bf96 100644 --- a/test/integration/prepared_statement_lifecycle.cpp +++ b/test/integration/prepared_statement_lifecycle.cpp @@ -232,13 +232,13 @@ struct PreparedStatementLifecycleTest : NetworkTest } }; -MYSQL_NETWORK_TEST_SUITE2(PreparedStatementLifecycleTest); +BOOST_MYSQL_NETWORK_TEST_SUITE(PreparedStatementLifecycleTest); -MYSQL_NETWORK_TEST(PreparedStatementLifecycleTest, SelectWithParametersMultipleExecutions) -MYSQL_NETWORK_TEST(PreparedStatementLifecycleTest, InsertWithParametersMultipleExecutions) -MYSQL_NETWORK_TEST(PreparedStatementLifecycleTest, UpdateWithParametersMultipleExecutions) -MYSQL_NETWORK_TEST(PreparedStatementLifecycleTest, MultipleStatements) -MYSQL_NETWORK_TEST(PreparedStatementLifecycleTest, InsertWithNullValues) +BOOST_MYSQL_NETWORK_TEST(PreparedStatementLifecycleTest, SelectWithParametersMultipleExecutions) +BOOST_MYSQL_NETWORK_TEST(PreparedStatementLifecycleTest, InsertWithParametersMultipleExecutions) +BOOST_MYSQL_NETWORK_TEST(PreparedStatementLifecycleTest, UpdateWithParametersMultipleExecutions) +BOOST_MYSQL_NETWORK_TEST(PreparedStatementLifecycleTest, MultipleStatements) +BOOST_MYSQL_NETWORK_TEST(PreparedStatementLifecycleTest, InsertWithNullValues) } diff --git a/test/integration/query.cpp b/test/integration/query.cpp index 5fd4d72f..6a9e5fa6 100644 --- a/test/integration/query.cpp +++ b/test/integration/query.cpp @@ -94,14 +94,14 @@ struct QueryTest : public NetworkTest } }; -MYSQL_NETWORK_TEST_SUITE2(QueryTest); +BOOST_MYSQL_NETWORK_TEST_SUITE(QueryTest); -MYSQL_NETWORK_TEST(QueryTest, InsertQueryOk) -MYSQL_NETWORK_TEST(QueryTest, InsertQueryFailed) -MYSQL_NETWORK_TEST(QueryTest, UpdateQueryOk) -MYSQL_NETWORK_TEST(QueryTest, SelectOk) -MYSQL_NETWORK_TEST(QueryTest, SelectQueryFailed) -MYSQL_NETWORK_TEST(QueryTest, QueryAndFetch_AliasedTableAndField_MetadataCorrect) +BOOST_MYSQL_NETWORK_TEST(QueryTest, InsertQueryOk) +BOOST_MYSQL_NETWORK_TEST(QueryTest, InsertQueryFailed) +BOOST_MYSQL_NETWORK_TEST(QueryTest, UpdateQueryOk) +BOOST_MYSQL_NETWORK_TEST(QueryTest, SelectOk) +BOOST_MYSQL_NETWORK_TEST(QueryTest, SelectQueryFailed) +BOOST_MYSQL_NETWORK_TEST(QueryTest, QueryAndFetch_AliasedTableAndField_MetadataCorrect) } // anon namespace diff --git a/test/integration/resultset.cpp b/test/integration/resultset.cpp index be89115c..bf0dd4fc 100644 --- a/test/integration/resultset.cpp +++ b/test/integration/resultset.cpp @@ -23,6 +23,7 @@ namespace net = boost::asio; namespace { +// Interface to generate a resultset template class resultset_generator { @@ -33,28 +34,66 @@ public: }; template -struct resultset_testcase : named_param, - network_testcase +class text_resultset_generator : public resultset_generator { - resultset_generator* gen; - - resultset_testcase(network_testcase base, resultset_generator* gen): - network_testcase(base), gen(gen) {} +public: + const char* name() const override { return "text"; } + resultset generate(connection& conn, std::string_view query) override + { + return conn.query(query); + } }; template -std::ostream& operator<<(std::ostream& os, const resultset_testcase& v) +class binary_resultset_generator : public resultset_generator { - return os << v.gen->name() << '.' - << v.net->name() << '.' - << to_string(v.ssl); -} +public: + const char* name() const override { return "binary"; } + resultset generate(connection& conn, std::string_view query) override + { + return conn.prepare_statement(query).execute(boost::mysql::no_statement_params); + } +}; + +template text_resultset_generator text_obj; +template binary_resultset_generator binary_obj; + +// Test parameter +template +struct resultset_testcase : network_testcase_with_ssl +{ + resultset_generator* gen; + + resultset_testcase(network_testcase_with_ssl base, resultset_generator* gen): + network_testcase_with_ssl(base), gen(gen) {} + + std::string name() const + { + return network_testcase_with_ssl::name() + '_' + gen->name(); + } + + static std::vector> make_all() + { + resultset_generator* all_resultset_generators [] = { + &text_obj, + &binary_obj + }; + + std::vector> res; + for (auto* gen: all_resultset_generators) + { + for (auto base: network_testcase_with_ssl::make_all()) + { + res.push_back(resultset_testcase(base, gen)); + } + } + return res; + } +}; template -struct ResultsetTest : public IntegTestAfterHandshake, - public testing::WithParamInterface> +struct ResultsetTest : public NetworkTest, true> { - ResultsetTest(): IntegTestAfterHandshake(this->GetParam().ssl) {} auto do_generate(std::string_view query) { return this->GetParam().gen->generate(this->conn, query); } auto do_fetch_one(resultset& r) { return this->GetParam().net->fetch_one(r); } auto do_fetch_many(resultset& r, std::size_t count) { return this->GetParam().net->fetch_many(r, count); } @@ -252,80 +291,19 @@ struct ResultsetTest : public IntegTestAfterHandshake, } }; -using ResultsetTestTCP = ResultsetTest; -#ifdef BOOST_ASIO_HAS_LOCAL_SOCKETS -using ResultsetTestUNIX = ResultsetTest; -#endif +BOOST_MYSQL_NETWORK_TEST_SUITE(ResultsetTest); -MYSQL_NETWORK_TEST(ResultsetTest, FetchOne_NoResults) -MYSQL_NETWORK_TEST(ResultsetTest, FetchOne_OneRow) -MYSQL_NETWORK_TEST(ResultsetTest, FetchOne_TwoRows) -MYSQL_NETWORK_TEST(ResultsetTest, FetchMany_NoResults) -MYSQL_NETWORK_TEST(ResultsetTest, FetchMany_MoreRowsThanCount) -MYSQL_NETWORK_TEST(ResultsetTest, FetchMany_LessRowsThanCount) -MYSQL_NETWORK_TEST(ResultsetTest, FetchMany_SameRowsAsCount) -MYSQL_NETWORK_TEST(ResultsetTest, FetchMany_CountEqualsOne) -MYSQL_NETWORK_TEST(ResultsetTest, FetchAll_NoResults) -MYSQL_NETWORK_TEST(ResultsetTest, FetchAll_OneRow) -MYSQL_NETWORK_TEST(ResultsetTest, FetchAll_SeveralRows) - - -// Instantiate the test suites -template -class text_resultset_generator : public resultset_generator -{ -public: - const char* name() const override { return "text"; } - resultset generate(connection& conn, std::string_view query) override - { - return conn.query(query); - } -}; - -template -class binary_resultset_generator : public resultset_generator -{ -public: - const char* name() const override { return "binary"; } - resultset generate(connection& conn, std::string_view query) override - { - return conn.prepare_statement(query).execute(boost::mysql::no_statement_params); - } -}; - -template text_resultset_generator text_obj; -template binary_resultset_generator binary_obj; - - -template -std::vector> make_all_resultset_testcases() -{ - resultset_generator* all_resultset_generators [] = { - &text_obj, - &binary_obj - }; - - std::vector> res; - for (auto* gen: all_resultset_generators) - { - for (auto base: make_all_network_testcases()) - { - res.push_back(resultset_testcase(base, gen)); - } - } - return res; -} - - -INSTANTIATE_TEST_SUITE_P(Default, ResultsetTestTCP, testing::ValuesIn( - make_all_resultset_testcases() -), test_name_generator); - -#ifdef BOOST_ASIO_HAS_LOCAL_SOCKETS -INSTANTIATE_TEST_SUITE_P(Default, ResultsetTestUNIX, testing::ValuesIn( - make_all_resultset_testcases() -), test_name_generator); -#endif +BOOST_MYSQL_NETWORK_TEST(ResultsetTest, FetchOne_NoResults) +BOOST_MYSQL_NETWORK_TEST(ResultsetTest, FetchOne_OneRow) +BOOST_MYSQL_NETWORK_TEST(ResultsetTest, FetchOne_TwoRows) +BOOST_MYSQL_NETWORK_TEST(ResultsetTest, FetchMany_NoResults) +BOOST_MYSQL_NETWORK_TEST(ResultsetTest, FetchMany_MoreRowsThanCount) +BOOST_MYSQL_NETWORK_TEST(ResultsetTest, FetchMany_LessRowsThanCount) +BOOST_MYSQL_NETWORK_TEST(ResultsetTest, FetchMany_SameRowsAsCount) +BOOST_MYSQL_NETWORK_TEST(ResultsetTest, FetchMany_CountEqualsOne) +BOOST_MYSQL_NETWORK_TEST(ResultsetTest, FetchAll_NoResults) +BOOST_MYSQL_NETWORK_TEST(ResultsetTest, FetchAll_OneRow) +BOOST_MYSQL_NETWORK_TEST(ResultsetTest, FetchAll_SeveralRows) }