mirror of
https://github.com/boostorg/redis.git
synced 2026-01-19 04:42:09 +00:00
Add parse event init, node and done.
This commit is contained in:
@@ -44,7 +44,6 @@ make_test(test_reader_fsm)
|
||||
|
||||
# Tests that require a real Redis server
|
||||
make_test(test_conn_quit)
|
||||
make_test(test_conn_tls)
|
||||
make_test(test_conn_exec_retry)
|
||||
make_test(test_conn_exec_error)
|
||||
make_test(test_run)
|
||||
@@ -59,6 +58,7 @@ make_test(test_conn_move)
|
||||
make_test(test_issue_50)
|
||||
make_test(test_issue_181)
|
||||
make_test(test_conversions)
|
||||
make_test(test_conn_tls)
|
||||
make_test(test_unix_sockets)
|
||||
|
||||
# Coverage
|
||||
|
||||
@@ -16,6 +16,7 @@ using boost::redis::generic_response;
|
||||
using boost::redis::response;
|
||||
using boost::redis::ignore;
|
||||
using boost::redis::any_adapter;
|
||||
using boost::redis::detail::make_any_adapter;
|
||||
|
||||
BOOST_AUTO_TEST_CASE(any_adapter_response_types)
|
||||
{
|
||||
@@ -24,23 +25,23 @@ BOOST_AUTO_TEST_CASE(any_adapter_response_types)
|
||||
response<int, std::string> r2;
|
||||
generic_response r3;
|
||||
|
||||
BOOST_CHECK_NO_THROW(any_adapter{r1});
|
||||
BOOST_CHECK_NO_THROW(any_adapter{r2});
|
||||
BOOST_CHECK_NO_THROW(any_adapter{r3});
|
||||
BOOST_CHECK_NO_THROW(any_adapter{ignore});
|
||||
BOOST_CHECK_NO_THROW(make_any_adapter(r1));
|
||||
BOOST_CHECK_NO_THROW(make_any_adapter(r2));
|
||||
BOOST_CHECK_NO_THROW(make_any_adapter(r3));
|
||||
BOOST_CHECK_NO_THROW(make_any_adapter(ignore));
|
||||
}
|
||||
|
||||
BOOST_AUTO_TEST_CASE(any_adapter_copy_move)
|
||||
{
|
||||
// any_adapter can be copied/moved
|
||||
response<int, std::string> r;
|
||||
any_adapter ad1{r};
|
||||
auto ad1 = make_any_adapter(r);
|
||||
|
||||
// copy constructor
|
||||
any_adapter ad2{ad1};
|
||||
auto ad2 = any_adapter(ad1);
|
||||
|
||||
// move constructor
|
||||
any_adapter ad3{std::move(ad2)};
|
||||
auto ad3 = any_adapter(std::move(ad2));
|
||||
|
||||
// copy assignment
|
||||
BOOST_CHECK_NO_THROW(ad2 = ad1);
|
||||
|
||||
@@ -31,6 +31,7 @@ using boost::redis::ignore;
|
||||
using boost::redis::operation;
|
||||
using boost::redis::request;
|
||||
using boost::redis::response;
|
||||
using boost::redis::detail::make_any_adapter;
|
||||
using boost::system::error_code;
|
||||
using namespace std::chrono_literals;
|
||||
|
||||
@@ -229,7 +230,7 @@ BOOST_AUTO_TEST_CASE(exec_any_adapter)
|
||||
|
||||
bool finished = false;
|
||||
|
||||
conn->async_exec(req, boost::redis::any_adapter(res), [&](error_code ec, std::size_t) {
|
||||
conn->async_exec(req, make_any_adapter(res), [&](error_code ec, std::size_t) {
|
||||
BOOST_TEST(ec == error_code());
|
||||
conn->cancel();
|
||||
finished = true;
|
||||
@@ -242,4 +243,4 @@ BOOST_AUTO_TEST_CASE(exec_any_adapter)
|
||||
BOOST_TEST(std::get<0>(res).value() == "PONG");
|
||||
}
|
||||
|
||||
} // namespace
|
||||
} // namespace
|
||||
|
||||
@@ -180,19 +180,15 @@ struct response_error_tag { };
|
||||
response_error_tag error_tag_obj;
|
||||
|
||||
struct response_error_adapter {
|
||||
void operator()(
|
||||
std::size_t,
|
||||
void on_init() { }
|
||||
void on_done() { }
|
||||
|
||||
void on_node(
|
||||
boost::redis::resp3::basic_node<std::string_view> const&,
|
||||
boost::system::error_code& ec)
|
||||
{
|
||||
ec = boost::redis::error::incompatible_size;
|
||||
}
|
||||
|
||||
[[nodiscard]]
|
||||
auto get_supported_response_size() const noexcept
|
||||
{
|
||||
return static_cast<std::size_t>(-1);
|
||||
}
|
||||
};
|
||||
|
||||
auto boost_redis_adapt(response_error_tag&) { return response_error_adapter{}; }
|
||||
|
||||
@@ -86,7 +86,8 @@ struct elem_and_request {
|
||||
|
||||
elm = std::make_shared<multiplexer::elem>(
|
||||
req,
|
||||
[](std::size_t, resp3::node_view const&, error_code&) { });
|
||||
[](parse_event, resp3::node_view const&, error_code&) { });
|
||||
|
||||
elm->set_done_callback([this] {
|
||||
++done_calls;
|
||||
});
|
||||
|
||||
@@ -595,8 +595,12 @@ BOOST_AUTO_TEST_CASE(adapter)
|
||||
response<std::string, int, ignore_t> resp;
|
||||
|
||||
auto f = boost_redis_adapt(resp);
|
||||
f(0, resp3::basic_node<std::string_view>{type::simple_string, 1, 0, "Hello"}, ec);
|
||||
f(1, resp3::basic_node<std::string_view>{type::number, 1, 0, "42"}, ec);
|
||||
f.on_init();
|
||||
f.on_node(resp3::node_view{type::simple_string, 1, 0, "Hello"}, ec);
|
||||
f.on_done();
|
||||
f.on_init();
|
||||
f.on_node(resp3::node_view{type::number, 1, 0, "42"}, ec);
|
||||
f.on_done();
|
||||
|
||||
BOOST_CHECK_EQUAL(std::get<0>(resp).value(), "Hello");
|
||||
BOOST_TEST(!ec);
|
||||
@@ -614,7 +618,7 @@ BOOST_AUTO_TEST_CASE(adapter_as)
|
||||
|
||||
for (auto const& e : set_expected1a.value()) {
|
||||
error_code ec;
|
||||
adapter(e, ec);
|
||||
adapter.on_node(e, ec);
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
@@ -32,16 +32,21 @@ using boost::redis::detail::multiplexer;
|
||||
using boost::redis::generic_response;
|
||||
using boost::redis::resp3::node;
|
||||
using boost::redis::resp3::to_string;
|
||||
using boost::redis::any_adapter;
|
||||
using boost::redis::detail::make_any_adapter;
|
||||
using boost::system::error_code;
|
||||
|
||||
#define RESP3_SET_PART1 "~6\r\n+orange\r"
|
||||
#define RESP3_SET_PART2 "\n+apple\r\n+one"
|
||||
#define RESP3_SET_PART3 "\r\n+two\r"
|
||||
#define RESP3_SET_PART4 "\n+three\r\n+orange\r\n"
|
||||
char const* resp3_set = RESP3_SET_PART1 RESP3_SET_PART2 RESP3_SET_PART3 RESP3_SET_PART4;
|
||||
|
||||
BOOST_AUTO_TEST_CASE(low_level_sync_sans_io)
|
||||
{
|
||||
try {
|
||||
result<std::set<std::string>> resp;
|
||||
|
||||
char const* wire = "~6\r\n+orange\r\n+apple\r\n+one\r\n+two\r\n+three\r\n+orange\r\n";
|
||||
deserialize(wire, adapt2(resp));
|
||||
deserialize(resp3_set, adapt2(resp));
|
||||
|
||||
for (auto const& e : resp.value())
|
||||
std::cout << e << std::endl;
|
||||
@@ -260,7 +265,7 @@ BOOST_AUTO_TEST_CASE(multiplexer_push)
|
||||
{
|
||||
multiplexer mpx;
|
||||
generic_response resp;
|
||||
mpx.set_receive_response(resp);
|
||||
mpx.set_receive_response(make_any_adapter(resp));
|
||||
|
||||
boost::system::error_code ec;
|
||||
auto const ret = mpx.consume_next(">2\r\n+one\r\n+two\r\n", ec);
|
||||
@@ -282,7 +287,7 @@ BOOST_AUTO_TEST_CASE(multiplexer_push_needs_more)
|
||||
{
|
||||
multiplexer mpx;
|
||||
generic_response resp;
|
||||
mpx.set_receive_response(resp);
|
||||
mpx.set_receive_response(make_any_adapter(resp));
|
||||
|
||||
std::string msg;
|
||||
// Only part of the message.
|
||||
@@ -318,7 +323,7 @@ struct test_item {
|
||||
// to Redis.
|
||||
req.push(cmd_with_response ? "PING" : "SUBSCRIBE", "cmd-arg");
|
||||
|
||||
elem_ptr = std::make_shared<multiplexer::elem>(req, any_adapter(resp).impl_.adapt_fn);
|
||||
elem_ptr = std::make_shared<multiplexer::elem>(req, make_any_adapter(resp));
|
||||
|
||||
elem_ptr->set_done_callback([this]() {
|
||||
done = true;
|
||||
@@ -462,3 +467,48 @@ BOOST_AUTO_TEST_CASE(read_buffer_check_buffer_size)
|
||||
|
||||
BOOST_CHECK_EQUAL(buf.get_append_buffer().size(), 10u);
|
||||
}
|
||||
|
||||
BOOST_AUTO_TEST_CASE(check_counter_adapter)
|
||||
{
|
||||
using boost::redis::parse_event;
|
||||
using boost::redis::detail::any_adapter_wrapper;
|
||||
using boost::redis::resp3::parse;
|
||||
using boost::redis::resp3::parser;
|
||||
using boost::redis::resp3::node_view;
|
||||
using boost::system::error_code;
|
||||
|
||||
int init = 0;
|
||||
int node = 0;
|
||||
int done = 0;
|
||||
|
||||
auto counter_adapter = [&](parse_event ev, node_view const&, error_code&) mutable {
|
||||
switch (ev) {
|
||||
case parse_event::init: init++; break;
|
||||
case parse_event::node: node++; break;
|
||||
case parse_event::done: done++; break;
|
||||
}
|
||||
};
|
||||
|
||||
any_adapter_wrapper wrapped{counter_adapter, 1};
|
||||
|
||||
error_code ec;
|
||||
parser p;
|
||||
|
||||
auto const ret1 = parse(p, RESP3_SET_PART1, wrapped, ec);
|
||||
auto const ret2 = parse(p, RESP3_SET_PART1 RESP3_SET_PART2, wrapped, ec);
|
||||
auto const ret3 = parse(p, RESP3_SET_PART1 RESP3_SET_PART2 RESP3_SET_PART3, wrapped, ec);
|
||||
auto const ret4 = parse(
|
||||
p,
|
||||
RESP3_SET_PART1 RESP3_SET_PART2 RESP3_SET_PART3 RESP3_SET_PART4,
|
||||
wrapped,
|
||||
ec);
|
||||
|
||||
BOOST_TEST(!ret1);
|
||||
BOOST_TEST(!ret2);
|
||||
BOOST_TEST(!ret3);
|
||||
BOOST_TEST(ret4);
|
||||
|
||||
BOOST_CHECK_EQUAL(init, 1);
|
||||
BOOST_CHECK_EQUAL(node, 7);
|
||||
BOOST_CHECK_EQUAL(done, 1);
|
||||
}
|
||||
|
||||
@@ -23,6 +23,7 @@ using redis::detail::reader_fsm;
|
||||
using redis::detail::multiplexer;
|
||||
using redis::detail::read_buffer;
|
||||
using redis::generic_response;
|
||||
using redis::detail::make_any_adapter;
|
||||
using action = redis::detail::reader_fsm::action;
|
||||
|
||||
namespace boost::redis::detail {
|
||||
@@ -44,7 +45,7 @@ void test_push()
|
||||
read_buffer rbuf;
|
||||
multiplexer mpx;
|
||||
generic_response resp;
|
||||
mpx.set_receive_response(resp);
|
||||
mpx.set_receive_response(make_any_adapter(resp));
|
||||
reader_fsm fsm{rbuf, mpx};
|
||||
error_code ec;
|
||||
action act;
|
||||
@@ -92,7 +93,7 @@ void test_read_needs_more()
|
||||
read_buffer rbuf;
|
||||
multiplexer mpx;
|
||||
generic_response resp;
|
||||
mpx.set_receive_response(resp);
|
||||
mpx.set_receive_response(make_any_adapter(resp));
|
||||
reader_fsm fsm{rbuf, mpx};
|
||||
error_code ec;
|
||||
action act;
|
||||
@@ -138,7 +139,7 @@ void test_read_error()
|
||||
read_buffer rbuf;
|
||||
multiplexer mpx;
|
||||
generic_response resp;
|
||||
mpx.set_receive_response(resp);
|
||||
mpx.set_receive_response(make_any_adapter(resp));
|
||||
reader_fsm fsm{rbuf, mpx};
|
||||
error_code ec;
|
||||
action act;
|
||||
@@ -169,7 +170,7 @@ void test_parse_error()
|
||||
read_buffer rbuf;
|
||||
multiplexer mpx;
|
||||
generic_response resp;
|
||||
mpx.set_receive_response(resp);
|
||||
mpx.set_receive_response(make_any_adapter(resp));
|
||||
reader_fsm fsm{rbuf, mpx};
|
||||
error_code ec;
|
||||
action act;
|
||||
@@ -200,7 +201,7 @@ void test_push_deliver_error()
|
||||
read_buffer rbuf;
|
||||
multiplexer mpx;
|
||||
generic_response resp;
|
||||
mpx.set_receive_response(resp);
|
||||
mpx.set_receive_response(make_any_adapter(resp));
|
||||
reader_fsm fsm{rbuf, mpx};
|
||||
error_code ec;
|
||||
action act;
|
||||
@@ -236,7 +237,7 @@ void test_max_read_buffer_size()
|
||||
rbuf.set_config({5, 7});
|
||||
multiplexer mpx;
|
||||
generic_response resp;
|
||||
mpx.set_receive_response(resp);
|
||||
mpx.set_receive_response(make_any_adapter(resp));
|
||||
reader_fsm fsm{rbuf, mpx};
|
||||
error_code ec;
|
||||
action act;
|
||||
|
||||
Reference in New Issue
Block a user