/* * execute_statement.cpp * * Created on: Feb 5, 2020 * Author: ruben */ #include "integration_test_common.hpp" #include using namespace mysql::test; using mysql::value; using mysql::error_code; using mysql::error_info; using mysql::Error; using mysql::tcp_resultset; using mysql::tcp_prepared_statement; namespace { // Iterator version using listit = std::forward_list::const_iterator; struct ExecuteStatementIteratorTraits { static tcp_resultset sync_errc(const tcp_prepared_statement& stmt, listit first, listit last, error_code& errc, error_info& info) { return stmt.execute(first, last, errc, info); } static tcp_resultset sync_exc(const tcp_prepared_statement& stmt, listit first, listit last) { return stmt.execute(first, last); } }; struct ExecuteStatementIteratorTest : public NetworkTest {}; TEST_P(ExecuteStatementIteratorTest, OkNoParams) { std::forward_list params; auto stmt = conn.prepare_statement("SELECT * FROM empty_table"); auto result = GetParam().fun(stmt, params.begin(), params.end()); // execute result.validate_no_error(); EXPECT_TRUE(result.value.valid()); } TEST_P(ExecuteStatementIteratorTest, OkWithParams) { std::forward_list params { value("item"), value(42) }; auto stmt = conn.prepare_statement("SELECT * FROM empty_table WHERE id IN (?, ?)"); auto result = GetParam().fun(stmt, params.begin(), params.end()); result.validate_no_error(); EXPECT_TRUE(result.value.valid()); } TEST_P(ExecuteStatementIteratorTest, MismatchedNumParams) { std::forward_list params { value("item") }; auto stmt = conn.prepare_statement("SELECT * FROM empty_table WHERE id IN (?, ?)"); auto result = GetParam().fun(stmt, params.begin(), params.end()); result.validate_error(Error::wrong_num_params, {"param", "2", "1", "statement", "execute"}); EXPECT_FALSE(result.value.valid()); } // TODO: is there any way of making server return an error here? MYSQL_NETWORK_TEST_SUITE(ExecuteStatementIteratorTest); // Container version struct ExecuteStatementContainerTraits { static tcp_resultset sync_errc(const tcp_prepared_statement& stmt, const std::vector& v, error_code& errc, error_info& info) { return stmt.execute(v, errc, info); } static tcp_resultset sync_exc(const tcp_prepared_statement& stmt, const std::vector& v) { return stmt.execute(v); } }; struct ExecuteStatementContainerTest : public NetworkTest {}; TEST_P(ExecuteStatementContainerTest, OkNoParams) { auto stmt = conn.prepare_statement("SELECT * FROM empty_table"); auto result = GetParam().fun(stmt, std::vector()); // execute result.validate_no_error(); EXPECT_TRUE(result.value.valid()); } TEST_P(ExecuteStatementContainerTest, OkWithParams) { std::vector params { value("item"), value(42) }; auto stmt = conn.prepare_statement("SELECT * FROM empty_table WHERE id IN (?, ?)"); auto result = GetParam().fun(stmt, params); result.validate_no_error(); EXPECT_TRUE(result.value.valid()); } TEST_P(ExecuteStatementContainerTest, MismatchedNumParams) { std::vector params { value("item") }; auto stmt = conn.prepare_statement("SELECT * FROM empty_table WHERE id IN (?, ?)"); auto result = GetParam().fun(stmt, params); result.validate_error(Error::wrong_num_params, {"param", "2", "1", "statement", "execute"}); EXPECT_FALSE(result.value.valid()); } MYSQL_NETWORK_TEST_SUITE(ExecuteStatementContainerTest); struct ExecuteStatementOtherContainersTest : IntegTestAfterHandshake {}; TEST_F(ExecuteStatementOtherContainersTest, NoParams_CanUseNoStatementParamsVariable) { auto stmt = conn.prepare_statement("SELECT * FROM empty_table"); auto result = stmt.execute(mysql::no_statement_params); EXPECT_TRUE(result.valid()); } TEST_F(ExecuteStatementOtherContainersTest, CArray) { value arr [] = { value("hola"), value(10) }; auto stmt = conn.prepare_statement("SELECT * FROM empty_table WHERE id IN (?, ?)"); auto result = stmt.execute(arr); EXPECT_TRUE(result.valid()); } }