From 5f03aa6626a1137bcd18abdfbdb927fba73153c2 Mon Sep 17 00:00:00 2001 From: Marcelo Zimbres Date: Sun, 7 Nov 2021 12:25:56 +0100 Subject: [PATCH] Progresses removing stream class. Improvements in the pubsub example. --- examples/basic1.cpp | 12 +-- examples/basic2.cpp | 7 +- examples/basic3.cpp | 37 +++---- examples/pubsub.cpp | 71 ++++++-------- include/aedis/aedis.hpp | 11 ++- include/aedis/resp3/detail/impl/parser.ipp | 4 +- include/aedis/resp3/detail/parser.hpp | 10 +- include/aedis/resp3/{detail => }/read.hpp | 34 ++++--- include/aedis/resp3/response.hpp | 4 +- ...nse_adapter_base.hpp => response_base.hpp} | 4 +- include/aedis/resp3/stream.hpp | 12 +-- include/aedis/resp3/{detail => }/write.hpp | 17 +++- tests/basic_flat_array_adapter.hpp | 4 +- tests/general.cpp | 97 +++++++++---------- 14 files changed, 167 insertions(+), 157 deletions(-) rename include/aedis/resp3/{detail => }/read.hpp (90%) rename include/aedis/resp3/{response_adapter_base.hpp => response_base.hpp} (90%) rename include/aedis/resp3/{detail => }/write.hpp (87%) diff --git a/examples/basic1.cpp b/examples/basic1.cpp index 0e225b78..1c6aa645 100644 --- a/examples/basic1.cpp +++ b/examples/basic1.cpp @@ -5,6 +5,7 @@ * file, You can obtain one at https://mozilla.org/MPL/2.0/. */ +#include #include #include @@ -24,19 +25,18 @@ using namespace aedis; net::awaitable ping() { auto socket = co_await make_connection(); - resp3::stream stream{std::move(socket)}; resp3::request req; req.push(command::hello, 3); req.push(command::ping); req.push(command::quit); + co_await async_write(socket, req); - co_await stream.async_write(req); - + std::string buffer; resp3::response resp; - co_await stream.async_read(resp); - co_await stream.async_read(resp); - co_await stream.async_read(resp); + co_await async_read(socket, buffer, resp); + co_await async_read(socket, buffer, resp); + co_await async_read(socket, buffer, resp); std::cout << resp << std::endl; } diff --git a/examples/basic2.cpp b/examples/basic2.cpp index e0202745..8056b94a 100644 --- a/examples/basic2.cpp +++ b/examples/basic2.cpp @@ -22,18 +22,17 @@ using namespace aedis; net::awaitable ping() { auto socket = co_await make_connection(); - resp3::stream stream{std::move(socket)}; resp3::request req; req.push(command::hello, 3); req.push(command::ping); req.push(command::quit); + co_await async_write(socket, req); - co_await stream.async_write(req); - + std::string buffer; while (!std::empty(req.commands)) { resp3::response resp; - co_await stream.async_read(resp); + co_await async_read(socket, buffer, resp); std::cout << req.commands.front() << ":\n" << resp << std::endl; req.commands.pop(); } diff --git a/examples/basic3.cpp b/examples/basic3.cpp index 3473cf63..094efdfb 100644 --- a/examples/basic3.cpp +++ b/examples/basic3.cpp @@ -30,21 +30,21 @@ void prepare_next(std::queue& reqs) } void process_response( - std::queue& requests, + std::queue& reqs, resp3::response& resp) { std::cout - << requests.front().commands.front() << ":\n" + << reqs.front().commands.front() << ":\n" << resp << std::endl; - switch (requests.front().commands.front()) { + switch (reqs.front().commands.front()) { case command::hello: - prepare_next(requests); - requests.back().push(command::ping); + prepare_next(reqs); + reqs.back().push(command::ping); break; case command::ping: - prepare_next(requests); - requests.back().push(command::quit); + prepare_next(reqs); + reqs.back().push(command::quit); break; default: {}; } @@ -53,22 +53,23 @@ void process_response( net::awaitable ping() { auto socket = co_await make_connection(); - resp3::stream stream{std::move(socket)}; - std::queue requests; - requests.push({}); - requests.back().push(command::hello, 3); + std::string buffer; - while (!std::empty(requests)) { - co_await stream.async_write(requests.front()); - while (!std::empty(requests.front().commands)) { + std::queue reqs; + reqs.push({}); + reqs.back().push(command::hello, 3); + + while (!std::empty(reqs)) { + co_await async_write(socket, reqs.front()); + while (!std::empty(reqs.front().commands)) { resp3::response resp; - co_await stream.async_read(resp); - process_response(requests, resp); - requests.front().commands.pop(); + co_await async_read(socket, buffer, resp); + process_response(reqs, resp); + reqs.front().commands.pop(); } - requests.pop(); + reqs.pop(); } } diff --git a/examples/pubsub.cpp b/examples/pubsub.cpp index 47eed644..6c743dac 100644 --- a/examples/pubsub.cpp +++ b/examples/pubsub.cpp @@ -14,59 +14,52 @@ using namespace aedis; +/** A simple coroutine used to pusblish on a channel and exit. + */ net::awaitable publisher() { - auto ex = net::this_coro::executor; auto socket = co_await make_connection(); - std::queue requests; - requests.push({}); - requests.back().push(command::hello, 3); - requests.back().push(command::publish, "channel1", "Message to channel1"); - requests.back().push(command::publish, "channel2", "Message to channel2"); - requests.back().push(command::quit); + resp3::request req; + req.push(command::hello, 3); + req.push(command::publish, "channel1", "Message to channel1"); + req.push(command::publish, "channel2", "Message to channel2"); + req.push(command::quit); + co_await async_write(socket, req); - resp3::stream stream{std::move(socket)}; - for (;;) { - resp3::response resp; - co_await stream.async_consume(requests, resp); - } + std::string buffer; + resp3::response_base ignore; + co_await async_read(socket, buffer, ignore); + co_await async_read(socket, buffer, ignore); + co_await async_read(socket, buffer, ignore); } net::awaitable subscriber() { - auto ex = net::this_coro::executor; auto socket = co_await make_connection(); - std::string id; + resp3::request req; + req.push(command::hello, "3"); + req.push(command::subscribe, "channel1", "channel2"); + co_await async_write(socket, req); - std::queue requests; - requests.push({}); - requests.back().push(command::hello, "3"); - requests.back().push(command::subscribe, "channel1", "channel2"); + std::string buffer; + resp3::response resp; - resp3::stream stream{std::move(socket)}; + // Reads the response to the hello command. + co_await async_read(socket, buffer, resp); + + // Saves the id of this connection. + auto const id = resp.raw().at(8).data; + + // Reads the response to the subscribe command. + co_await async_read(socket, buffer, resp); + + // Loops to receive server pushes. for (;;) { - resp3::response resp; - co_await stream.async_consume(requests, resp); - - if (resp.get_type() == resp3::type::push) { - std::cout - << "Subscriber " << id << "\n" - << resp << std::endl; - continue; - } - - auto const cmd = requests.front().commands.front(); - switch (cmd) { - case command::hello: - id = resp.raw().at(8).data; - break; - default: - std::cout - << cmd << "\n" - << resp << std::endl; - } + resp.clear(); + co_await async_read(socket, buffer, resp); + std::cout << "Subscriber " << id << ":\n" << resp << std::endl; } } diff --git a/include/aedis/aedis.hpp b/include/aedis/aedis.hpp index 9eaa4b02..f9ea5fa0 100644 --- a/include/aedis/aedis.hpp +++ b/include/aedis/aedis.hpp @@ -7,6 +7,13 @@ #pragma once +#include +#include +#include +#include +#include +#include + /** \mainpage My Personal Index Page \section intro_sec Introduction @@ -61,7 +68,3 @@ * aedis. */ -#include -#include -#include -#include diff --git a/include/aedis/resp3/detail/impl/parser.ipp b/include/aedis/resp3/detail/impl/parser.ipp index 67c01569..6c150013 100644 --- a/include/aedis/resp3/detail/impl/parser.ipp +++ b/include/aedis/resp3/detail/impl/parser.ipp @@ -23,10 +23,10 @@ long long length(char const* p) return len; } -parser::parser(response_adapter_base* res) +parser::parser(response_base* res) { init(res); } -void parser::init(response_adapter_base* res) +void parser::init(response_base* res) { res_ = res; depth_ = 0; diff --git a/include/aedis/resp3/detail/parser.hpp b/include/aedis/resp3/detail/parser.hpp index bfd69e05..1be82784 100644 --- a/include/aedis/resp3/detail/parser.hpp +++ b/include/aedis/resp3/detail/parser.hpp @@ -9,7 +9,7 @@ #include #include -#include +#include namespace aedis { namespace resp3 { @@ -27,13 +27,13 @@ public: }; private: - response_adapter_base* res_; + response_base* res_; int depth_; int sizes_[6]; // Streaming will require a bigger integer. bulk_type bulk_; int bulk_length_; - void init(response_adapter_base* res); + void init(response_base* res); void on_aggregate(type t, char const* data); void on_null(); void on_data(type t, char const* data, std::size_t n); @@ -42,7 +42,7 @@ private: void on_blob_string(char const* data); public: - parser(response_adapter_base* res); + parser(response_base* res); std::size_t advance(char const* data, std::size_t n); auto done() const noexcept { return depth_ == 0 && bulk_ == bulk_type::none; } auto bulk() const noexcept { return bulk_; } @@ -61,7 +61,7 @@ private: int start_ = 1; public: - parse_op(AsyncReadStream& stream, Storage* buf, response_adapter_base* res) + parse_op(AsyncReadStream& stream, Storage* buf, response_base* res) : stream_ {stream} , buf_ {buf} , parser_ {res} diff --git a/include/aedis/resp3/detail/read.hpp b/include/aedis/resp3/read.hpp similarity index 90% rename from include/aedis/resp3/detail/read.hpp rename to include/aedis/resp3/read.hpp index 4900d49e..c41da66d 100644 --- a/include/aedis/resp3/detail/read.hpp +++ b/include/aedis/resp3/read.hpp @@ -12,27 +12,26 @@ #include #include #include -#include +#include #include -#include +#include #include namespace aedis { namespace resp3 { -namespace detail { template auto read( SyncReadStream& stream, Storage& buf, - response_adapter_base& res, + response_base& res, boost::system::error_code& ec) { - parser p {&res}; + detail::parser p {&res}; std::size_t n = 0; do { - if (p.bulk() == parser::bulk_type::none) { + if (p.bulk() == detail::parser::bulk_type::none) { n = net::read_until(stream, net::dynamic_buffer(buf), "\r\n", ec); if (ec || n < 3) return n; @@ -61,7 +60,7 @@ std::size_t read( SyncReadStream& stream, Storage& buf, - response_adapter_base& res) + response_base& res) { boost::system::error_code ec; auto const n = read(stream, buf, res, ec); @@ -72,23 +71,28 @@ read( return n; } +/** @brief Reads one command from the redis response + * + * Note: This function has to be called once for each command. + */ template < class AsyncReadStream, + class Response, class Storage, class CompletionToken = net::default_completion_token_t > -auto async_read_one( +auto async_read( AsyncReadStream& stream, Storage& buffer, - response& resp, + Response& resp, CompletionToken&& token = net::default_completion_token_t{}) { return net::async_compose < CompletionToken , void(boost::system::error_code) - >(parse_op {stream, &buffer, &resp}, + >(detail::parse_op {stream, &buffer, &resp}, token, stream); } @@ -174,12 +178,15 @@ auto async_read_type( >(type_op {stream, &buffer}, token, stream); } -template +template < + class AsyncReadWriteStream, + class Response +> struct consumer_op { AsyncReadWriteStream& stream; std::string& buffer; std::queue& requests; - response& resp; + Response& resp; type& m_type; net::coroutine& coro; @@ -212,7 +219,7 @@ struct consumer_op { m_type = t; - yield async_read_one(stream, buffer, resp, std::move(self)); + yield async_read(stream, buffer, resp, std::move(self)); if (ec) { self.complete(ec, type::invalid); @@ -234,7 +241,6 @@ struct consumer_op { } }; -} // detail } // resp3 } // aedis diff --git a/include/aedis/resp3/response.hpp b/include/aedis/resp3/response.hpp index c4677706..31cdb678 100644 --- a/include/aedis/resp3/response.hpp +++ b/include/aedis/resp3/response.hpp @@ -10,14 +10,14 @@ #include #include #include -#include +#include namespace aedis { namespace resp3 { /** A pre-order-view of the response tree. */ -class response : public response_adapter_base { +class response : public response_base { public: /** Represents a node in the response tree. */ diff --git a/include/aedis/resp3/response_adapter_base.hpp b/include/aedis/resp3/response_base.hpp similarity index 90% rename from include/aedis/resp3/response_adapter_base.hpp rename to include/aedis/resp3/response_base.hpp index acdc1e6b..3558782c 100644 --- a/include/aedis/resp3/response_adapter_base.hpp +++ b/include/aedis/resp3/response_base.hpp @@ -18,12 +18,12 @@ namespace resp3 { * * Users are allowed to override this class to customize responses. */ -struct response_adapter_base { +struct response_base { virtual void add(type t, int n, int depth, std::string_view s = {}) {} /** Virtual destructor to allow inheritance. */ - virtual ~response_adapter_base() {} + virtual ~response_base() {} }; } // resp3 diff --git a/include/aedis/resp3/stream.hpp b/include/aedis/resp3/stream.hpp index 64e5a558..a5a1ef5f 100644 --- a/include/aedis/resp3/stream.hpp +++ b/include/aedis/resp3/stream.hpp @@ -12,7 +12,7 @@ #include #include #include -#include +#include namespace aedis { namespace resp3 { @@ -94,7 +94,7 @@ public: { return net::async_compose< CompletionToken, void(boost::system::error_code, type)>( - detail::consumer_op {next_layer_, buffer_, requests, resp, type_, coro_}, + consumer_op {next_layer_, buffer_, requests, resp, type_, coro_}, token, next_layer_); } @@ -112,14 +112,10 @@ public: return net::async_compose< CompletionToken, void(boost::system::error_code)>( - detail::write_some_op{next_layer_, requests}, + write_some_op{next_layer_, requests}, token, next_layer_); } - /** @brief Reads one command from the redis response - * - * Note: This function has to be called once for each command. - */ template > auto async_read( response& resp, @@ -153,7 +149,7 @@ public: return net::async_compose < CompletionToken , void(boost::system::error_code, type) - >(detail::type_op {next_layer_, &buffer_}, token, next_layer_); + >(type_op {next_layer_, &buffer_}, token, next_layer_); } }; diff --git a/include/aedis/resp3/detail/write.hpp b/include/aedis/resp3/write.hpp similarity index 87% rename from include/aedis/resp3/detail/write.hpp rename to include/aedis/resp3/write.hpp index 5f3d7d0b..74478c09 100644 --- a/include/aedis/resp3/detail/write.hpp +++ b/include/aedis/resp3/write.hpp @@ -17,7 +17,6 @@ namespace aedis { namespace resp3 { -namespace detail { template std::size_t @@ -108,7 +107,21 @@ async_write_some( token, stream); } -} // detail +template< + class AsyncWriteStream, + class CompletionToken = + net::default_completion_token_t + > +auto +async_write( + AsyncWriteStream& stream, + request const& req, + CompletionToken&& token = + net::default_completion_token_t{}) +{ + return net::async_write(stream, net::buffer(req.payload), token); +} + } // resp3 } // aedis diff --git a/tests/basic_flat_array_adapter.hpp b/tests/basic_flat_array_adapter.hpp index 3921435b..4775b58d 100644 --- a/tests/basic_flat_array_adapter.hpp +++ b/tests/basic_flat_array_adapter.hpp @@ -8,7 +8,7 @@ #pragma once #include -#include +#include #include "adapter_utils.hpp" @@ -20,7 +20,7 @@ template using basic_flat_array = std::vector; template -struct basic_flat_array_adapter : response_adapter_base { +struct basic_flat_array_adapter : response_base { int i = 0; basic_flat_array* result = nullptr; diff --git a/tests/general.cpp b/tests/general.cpp index acc7e390..4c4a02a1 100644 --- a/tests/general.cpp +++ b/tests/general.cpp @@ -8,7 +8,6 @@ #include #include -#include #include "test_stream.hpp" @@ -454,12 +453,12 @@ test_general(net::ip::tcp::resolver::results_type const& res) // // { // hello // gresp.clear(); -// co_await detail::async_read_one(socket, buf, gresp); +// co_await async_read(socket, buf, gresp); // } // // { // flushall // gresp.clear(); -// co_await detail::async_read_one(socket, buf, gresp); +// co_await async_read(socket, buf, gresp); // resp3::response::storage_type expected // { {1UL, 0UL, resp3::type::simple_string, {"OK"}} }; // check_equal(gresp.raw(), expected, "flushall"); @@ -469,21 +468,21 @@ test_general(net::ip::tcp::resolver::results_type const& res) // gresp.clear(); // resp3::response::storage_type expected // { {1UL, 0UL, resp3::type::number, {"6"}} }; -// co_await detail::async_read_one(socket, buf, gresp); +// co_await async_read(socket, buf, gresp); // check_equal(gresp.raw(), expected, "rpush"); // } // // { // lrange // resp3::flat_array_int_type buffer; // resp3::detail::basic_flat_array_adapter res{&buffer}; -// co_await detail::async_read_one(socket, buf, res); +// co_await async_read(socket, buf, res); // check_equal(buffer, list, "lrange-1"); // } // // { // lrange // resp3::flat_array_int_type buffer; // resp3::detail::basic_flat_array_adapter res{&buffer}; -// co_await detail::async_read_one(socket, buf, res); +// co_await async_read(socket, buf, res); // check_equal(buffer, std::vector{3, 4, 5}, "lrange-2"); // } // @@ -492,7 +491,7 @@ test_general(net::ip::tcp::resolver::results_type const& res) // resp3::response::storage_type expected // { {1UL, 0UL, resp3::type::simple_string, {"OK"}} }; // -// co_await detail::async_read_one(socket, buf, gresp); +// co_await async_read(socket, buf, gresp); // check_equal(gresp.raw(), expected, "ltrim"); // } // @@ -501,13 +500,13 @@ test_general(net::ip::tcp::resolver::results_type const& res) // resp3::response::storage_type expected // { {1UL, 0UL, resp3::type::blob_string, {"3"}} }; // -// co_await detail::async_read_one(socket, buf, gresp); +// co_await async_read(socket, buf, gresp); // check_equal(gresp.raw(), expected, "lpop"); // } // // { // quit // gresp.clear(); -// co_await detail::async_read_one(socket, buf, gresp); +// co_await async_read(socket, buf, gresp); // resp3::response::storage_type expected // { {1UL, 0UL, resp3::type::simple_string, {"OK"}} }; // check_equal(gresp.raw(), expected, "ltrim"); @@ -547,13 +546,13 @@ test_set(net::ip::tcp::resolver::results_type const& results) std::string buf; { // hello, flushall gresp.clear(); - co_await detail::async_read_one(socket, buf, gresp); - co_await detail::async_read_one(socket, buf, gresp); + co_await async_read(socket, buf, gresp); + co_await async_read(socket, buf, gresp); } { // set gresp.clear(); - co_await detail::async_read_one(socket, buf, gresp); + co_await async_read(socket, buf, gresp); resp3::response::storage_type expected { {1UL, 0UL, resp3::type::simple_string, {"OK"}} }; check_equal(gresp.raw(), expected, "set1"); @@ -564,13 +563,13 @@ test_set(net::ip::tcp::resolver::results_type const& results) resp3::response::storage_type expected { {1UL, 0UL, resp3::type::blob_string, test_bulk1} }; - co_await detail::async_read_one(socket, buf, gresp); + co_await async_read(socket, buf, gresp); check_equal(gresp.raw(), expected, "get1"); } { // set gresp.clear(); - co_await detail::async_read_one(socket, buf, gresp); + co_await async_read(socket, buf, gresp); resp3::response::storage_type expected { {1UL, 0UL, resp3::type::simple_string, {"OK"}} }; check_equal(gresp.raw(), expected, "ltrim"); @@ -580,13 +579,13 @@ test_set(net::ip::tcp::resolver::results_type const& results) gresp.clear(); resp3::response::storage_type expected { {1UL, 0UL, resp3::type::blob_string, test_bulk2} }; - co_await detail::async_read_one(socket, buf, gresp); + co_await async_read(socket, buf, gresp); check_equal(gresp.raw(), expected, "get2"); } { // set gresp.clear(); - co_await detail::async_read_one(socket, buf, gresp); + co_await async_read(socket, buf, gresp); resp3::response::storage_type expected { {1UL, 0UL, resp3::type::simple_string, {"OK"}} }; check_equal(gresp.raw(), expected, "set3"); @@ -597,13 +596,13 @@ test_set(net::ip::tcp::resolver::results_type const& results) resp3::response::storage_type expected { {1UL, 0UL, resp3::type::blob_string, {}} }; - co_await detail::async_read_one(socket, buf, gresp); + co_await async_read(socket, buf, gresp); check_equal(gresp.raw(), expected, "get3"); } { // quit gresp.clear(); - co_await detail::async_read_one(socket, buf, gresp); + co_await async_read(socket, buf, gresp); resp3::response::storage_type expected { {1UL, 0UL, resp3::type::simple_string, {"OK"}} }; check_equal(gresp.raw(), expected, "quit"); @@ -626,7 +625,7 @@ net::awaitable test_simple_string() std::string cmd {"+OK\r\n"}; test_tcp_socket ts {cmd}; gresp.clear(); - co_await detail::async_read_one(ts, buf, gresp); + co_await async_read(ts, buf, gresp); resp3::response::storage_type expected { {1UL, 0UL, resp3::type::simple_string, {"OK"}} }; check_equal(gresp.raw(), expected, "simple_string"); @@ -637,7 +636,7 @@ net::awaitable test_simple_string() std::string cmd {"+\r\n"}; test_tcp_socket ts {cmd}; gresp.clear(); - co_await detail::async_read_one(ts, buf, gresp); + co_await async_read(ts, buf, gresp); resp3::response::storage_type expected { {1UL, 0UL, resp3::type::simple_string, {}} }; check_equal(gresp.raw(), expected, "simple_string (empty)"); @@ -653,7 +652,7 @@ net::awaitable test_simple_string() // cmd += "\r\n"; // test_tcp_socket ts {cmd}; // resp3::detail::simple_string_adapter res; - // co_await detail::async_read_one(ts, buffer, res); + // co_await async_read(ts, buffer, res); // check_equal(res.result, str, "simple_string (large)"); // //check_equal(res.attribute.value, {}, "simple_string (empty attribute)"); //} @@ -669,7 +668,7 @@ net::awaitable test_number() gresp.clear(); resp3::response::storage_type expected { {1UL, 0UL, resp3::type::number, {"-3"}} }; - co_await detail::async_read_one(ts, buf, gresp); + co_await async_read(ts, buf, gresp); check_equal(gresp.raw(), expected, "number (int)"); } @@ -679,7 +678,7 @@ net::awaitable test_number() gresp.clear(); resp3::response::storage_type expected { {1UL, 0UL, resp3::type::number, {"3"}} }; - co_await detail::async_read_one(ts, buf, gresp); + co_await async_read(ts, buf, gresp); check_equal(gresp.raw(), expected, "number (unsigned)"); } @@ -689,7 +688,7 @@ net::awaitable test_number() gresp.clear(); resp3::response::storage_type expected { {1UL, 0UL, resp3::type::number, {"1111111"}} }; - co_await detail::async_read_one(ts, buf, gresp); + co_await async_read(ts, buf, gresp); check_equal(gresp.raw(), expected, "number (std::size_t)"); } } @@ -708,7 +707,7 @@ net::awaitable test_array() , {1UL, 1UL, resp3::type::blob_string, {"two"}} , {1UL, 1UL, resp3::type::blob_string, {"three"}} }; - co_await detail::async_read_one(ts, buf, gresp); + co_await async_read(ts, buf, gresp); check_equal(gresp.raw(), expected, "array"); } @@ -717,7 +716,7 @@ net::awaitable test_array() // test_tcp_socket ts {cmd}; // resp3::flat_array_int_type buffer; // resp3::flat_array_int_adapter res{&buffer}; - // co_await detail::async_read_one(ts, buf, res); + // co_await async_read(ts, buf, res); // check_equal(buffer, {1, 2, 3}, "array (int)"); //} @@ -727,7 +726,7 @@ net::awaitable test_array() gresp.clear(); resp3::response::storage_type expected { {0UL, 0UL, resp3::type::array, {}} }; - co_await detail::async_read_one(ts, buf, gresp); + co_await async_read(ts, buf, gresp); check_equal(gresp.raw(), expected, "array (empty)"); } } @@ -742,7 +741,7 @@ net::awaitable test_blob_string() gresp.clear(); resp3::response::storage_type expected { {1UL, 0UL, resp3::type::blob_string, {"hh"}} }; - co_await detail::async_read_one(ts, buf, gresp); + co_await async_read(ts, buf, gresp); check_equal(gresp.raw(), expected, "blob_string"); } @@ -752,7 +751,7 @@ net::awaitable test_blob_string() gresp.clear(); resp3::response::storage_type expected { {1UL, 0UL, resp3::type::blob_string, {"hhaa\aaaa\raaaaa\r\naaaaaaaaaa"}} }; - co_await detail::async_read_one(ts, buf, gresp); + co_await async_read(ts, buf, gresp); check_equal(gresp.raw(), expected, "blob_string (with separator)"); } @@ -762,7 +761,7 @@ net::awaitable test_blob_string() gresp.clear(); resp3::response::storage_type expected { {1UL, 0UL, resp3::type::blob_string, {}} }; - co_await detail::async_read_one(ts, buf, gresp); + co_await async_read(ts, buf, gresp); check_equal(gresp.raw(), expected, "blob_string (size 0)"); } } @@ -777,7 +776,7 @@ net::awaitable test_simple_error() gresp.clear(); resp3::response::storage_type expected { {1UL, 0UL, resp3::type::simple_error, {"Error"}} }; - co_await detail::async_read_one(ts, buf, gresp); + co_await async_read(ts, buf, gresp); check_equal(gresp.raw(), expected, "simple_error (message)"); } } @@ -792,7 +791,7 @@ net::awaitable test_floating_point() resp3::response resp; resp3::response::storage_type expected { {1UL, 0UL, resp3::type::doublean, {"1.23"}} }; - co_await detail::async_read_one(ts, buf, resp); + co_await async_read(ts, buf, resp); check_equal(resp.raw(), expected, "double"); } @@ -800,7 +799,7 @@ net::awaitable test_floating_point() std::string cmd {",inf\r\n"}; test_tcp_socket ts {cmd}; resp3::response resp; - co_await detail::async_read_one(ts, buf, resp); + co_await async_read(ts, buf, resp); resp3::response::storage_type expected { {1UL, 0UL, resp3::type::doublean, {"inf"}} }; check_equal(resp.raw(), expected, "double (inf)"); @@ -810,7 +809,7 @@ net::awaitable test_floating_point() std::string cmd {",-inf\r\n"}; test_tcp_socket ts {cmd}; resp3::response resp; - co_await detail::async_read_one(ts, buf, resp); + co_await async_read(ts, buf, resp); resp3::response::storage_type expected { {1UL, 0UL, resp3::type::doublean, {"-inf"}} }; check_equal(resp.raw(), expected, "double (-inf)"); @@ -829,7 +828,7 @@ net::awaitable test_boolean() resp3::response::storage_type expected { {1UL, 0UL, resp3::type::boolean, {"f"}} }; - co_await detail::async_read_one(ts, buf, resp); + co_await async_read(ts, buf, resp); check_equal(resp.raw(), expected, "bool (false)"); } @@ -840,7 +839,7 @@ net::awaitable test_boolean() resp3::response::storage_type expected { {1UL, 0UL, resp3::type::boolean, {"t"}} }; - co_await detail::async_read_one(ts, buf, resp); + co_await async_read(ts, buf, resp); check_equal(resp.raw(), expected, "bool (true)"); } } @@ -855,7 +854,7 @@ net::awaitable test_blob_error() gresp.clear(); resp3::response::storage_type expected { {1UL, 0UL, resp3::type::blob_error, {"SYNTAX invalid syntax"}} }; - co_await detail::async_read_one(ts, buf, gresp); + co_await async_read(ts, buf, gresp); check_equal(gresp.raw(), expected, "blob_error (message)"); } @@ -866,7 +865,7 @@ net::awaitable test_blob_error() resp3::response::storage_type expected { {1UL, 0UL, resp3::type::blob_error, {}} }; - co_await detail::async_read_one(ts, buf, gresp); + co_await async_read(ts, buf, gresp); check_equal(gresp.raw(), expected, "blob_error (empty message)"); } } @@ -881,7 +880,7 @@ net::awaitable test_verbatim_string() gresp.clear(); resp3::response::storage_type expected { {1UL, 0UL, resp3::type::verbatim_string, {"txt:Some string"}} }; - co_await detail::async_read_one(ts, buf, gresp); + co_await async_read(ts, buf, gresp); check_equal(gresp.raw(), expected, "verbatim_string"); } @@ -889,7 +888,7 @@ net::awaitable test_verbatim_string() std::string cmd {"=0\r\n\r\n"}; test_tcp_socket ts {cmd}; gresp.clear(); - co_await detail::async_read_one(ts, buf, gresp); + co_await async_read(ts, buf, gresp); resp3::response::storage_type expected { {1UL, 0UL, resp3::type::verbatim_string, {}} }; check_equal(gresp.raw(), expected, "verbatim_string (empty)"); @@ -914,7 +913,7 @@ net::awaitable test_set2() , { 1UL, 1UL, resp3::type::simple_string, {"three"}} }; - co_await detail::async_read_one(ts, buf, gresp); + co_await async_read(ts, buf, gresp); check_equal(gresp.raw(), expected, "test set (1)"); } @@ -927,7 +926,7 @@ net::awaitable test_set2() { { 0UL, 0UL, resp3::type::set, {}} }; - co_await detail::async_read_one(ts, buf, gresp); + co_await async_read(ts, buf, gresp); check_equal(gresp.raw(), expected, "test set (2)"); } } @@ -940,7 +939,7 @@ net::awaitable test_map() std::string cmd {"%7\r\n$6\r\nserver\r\n$5\r\nredis\r\n$7\r\nversion\r\n$5\r\n6.0.9\r\n$5\r\nproto\r\n:3\r\n$2\r\nid\r\n:203\r\n$4\r\nmode\r\n$10\r\nstandalone\r\n$4\r\nrole\r\n$6\r\nmaster\r\n$7\r\nmodules\r\n*0\r\n"}; test_tcp_socket ts {cmd}; gresp.clear(); - co_await detail::async_read_one(ts, buf, gresp); + co_await async_read(ts, buf, gresp); resp3::response::storage_type expected { {7UL, 0UL, resp3::type::map, {}} @@ -966,7 +965,7 @@ net::awaitable test_map() std::string cmd {"%0\r\n"}; test_tcp_socket ts {cmd}; gresp.clear(); - co_await detail::async_read_one(ts, buf, gresp); + co_await async_read(ts, buf, gresp); resp3::response::storage_type expected { {0UL, 0UL, resp3::type::map, {}} }; check_equal(gresp.raw(), expected, "test map (empty)"); @@ -983,7 +982,7 @@ net::awaitable test_streamed_string() gresp.clear(); resp3::response::storage_type expected { {1UL, 0UL, resp3::type::streamed_string_part, {"Hello world"}} }; - co_await detail::async_read_one(ts, buf, gresp); + co_await async_read(ts, buf, gresp); check_equal(gresp.raw(), expected, "streamed string"); } @@ -991,7 +990,7 @@ net::awaitable test_streamed_string() std::string cmd {"$?\r\n;0\r\n"}; test_tcp_socket ts {cmd}; resp3::response resp; - co_await detail::async_read_one(ts, buf, resp); + co_await async_read(ts, buf, resp); resp3::response::storage_type expected { {1UL, 0UL, resp3::type::streamed_string_part, {}} }; @@ -1006,7 +1005,7 @@ net::awaitable offline() // std::string cmd {"|1\r\n+key-popularity\r\n%2\r\n$1\r\na\r\n,0.1923\r\n$1\r\nb\r\n,0.0012\r\n"}; // test_tcp_socket ts {cmd}; // resp3::flat_radapter res; - // co_await detail::async_read_one(ts, buf, res); + // co_await async_read(ts, buf, res); // check_equal(res.result, {"key-popularity", "a", "0.1923", "b", "0.0012"}, "attribute"); //} @@ -1014,7 +1013,7 @@ net::awaitable offline() // std::string cmd {">4\r\n+pubsub\r\n+message\r\n+foo\r\n+bar\r\n"}; // test_tcp_socket ts {cmd}; // resp3::flat_radapter res; - // co_await detail::async_read_one(ts, buf, res); + // co_await async_read(ts, buf, res); // check_equal(res.result, {"pubsub", "message", "foo", "bar"}, "push type"); //} @@ -1022,7 +1021,7 @@ net::awaitable offline() // std::string cmd {">0\r\n"}; // test_tcp_socket ts {cmd}; // resp3::flat_radapter res; - // co_await detail::async_read_one(ts, buf, res); + // co_await async_read(ts, buf, res); // check_equal(res.result, {}, "push type (empty)"); //} }