AimRT/_deps/boost-src/libs/mysql/test/unit/regressions.cpp
2025-01-12 20:41:24 +08:00

77 lines
2.3 KiB
C++

//
// Copyright (c) 2019-2023 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 <boost/mysql/connection.hpp>
#include <boost/mysql/results.hpp>
#include <boost/asio/awaitable.hpp>
#include <boost/asio/buffer.hpp>
#include <boost/asio/io_context.hpp>
#include <boost/asio/use_awaitable.hpp>
#include <boost/test/unit_test.hpp>
#include <cstdint>
#include "assert_buffer_equals.hpp"
#include "buffer_concat.hpp"
#include "create_message.hpp"
#include "run_coroutine.hpp"
#include "test_connection.hpp"
#ifdef BOOST_ASIO_HAS_CO_AWAIT
using namespace boost::mysql::test;
using boost::asio::buffer;
using boost::mysql::results;
namespace {
BOOST_AUTO_TEST_SUITE(test_regressions)
// Make sure async_query() and friends don't cause side
// effects in the initiation
BOOST_AUTO_TEST_CASE(side_effects_in_initiation)
{
boost::asio::io_context ctx;
test_connection conn;
results result1, result2;
// Resultsets will be complete as soon as a message is read
auto ok_packet_1 = create_ok_packet_message(1, 1, 6, 0, 9, "ab");
auto ok_packet_2 = create_ok_packet_message(1, 2, 0, 0, 0, "uv");
conn.stream().add_message(ok_packet_2);
conn.stream().add_message(ok_packet_1);
// Launch coroutine and wait for completion
run_coroutine([&]() -> boost::asio::awaitable<void> {
// Call both queries but don't wait on them yet, so they don't initiate
auto aw1 = conn.async_query("Q1", result1, boost::asio::use_awaitable);
auto aw2 = conn.async_query("Q2", result2, boost::asio::use_awaitable);
// Run them in reverse order
co_await std::move(aw2);
co_await std::move(aw1);
});
// Check that we wrote Q2's message first, then Q1's
auto expected = concat_copy(
create_message(0, {0x03, 0x51, 0x32}), // query request Q2
create_message(0, {0x03, 0x51, 0x31}) // query request Q1
);
BOOST_MYSQL_ASSERT_BUFFER_EQUALS(buffer(conn.stream().bytes_written()), buffer(expected));
// Check that the results got the right ok_packets
BOOST_TEST(result1.affected_rows() == 1u);
BOOST_TEST(result2.affected_rows() == 2u);
}
BOOST_AUTO_TEST_SUITE_END()
} // namespace
#endif // BOOST_ASIO_HAS_CO_AWAIT