diff --git a/examples/example.cpp b/examples/example.cpp index 046a4f61..4d4bdb1a 100644 --- a/examples/example.cpp +++ b/examples/example.cpp @@ -17,7 +17,7 @@ namespace this_coro = net::this_coro; using namespace net; using namespace aedis; -awaitable example1() +net::awaitable example1() { auto ex = co_await this_coro::executor; @@ -58,7 +58,7 @@ awaitable example1() } } -awaitable example2() +net::awaitable example2() { auto ex = co_await this_coro::executor; @@ -80,7 +80,7 @@ awaitable example2() } } -awaitable example3() +net::awaitable example3() { tcp_socket socket {co_await this_coro::executor}; diff --git a/tests/general.cpp b/tests/general.cpp index 883fe04e..9a84370b 100644 --- a/tests/general.cpp +++ b/tests/general.cpp @@ -7,13 +7,15 @@ #include +#include "test_stream.hpp" + namespace net = aedis::net; using tcp = net::ip::tcp; using tcp_socket = net::use_awaitable_t<>::as_default_on_t; +using test_tcp_socket = net::use_awaitable_t<>::as_default_on_t>; namespace this_coro = net::this_coro; -using namespace net; using namespace aedis; void check_equal( @@ -31,7 +33,7 @@ void check_equal( std::cout << "Error" << std::endl; } -awaitable test1() +net::awaitable test1() { auto ex = co_await this_coro::executor; @@ -80,7 +82,7 @@ awaitable test1() p.quit(); r.push_back({"OK"}); - co_await async_write(socket, buffer(p.payload)); + co_await async_write(socket, net::buffer(p.payload)); resp::buffer buffer; for (auto const& o : r) { @@ -90,7 +92,7 @@ awaitable test1() } } -awaitable resp3() +net::awaitable resp3() { auto ex = co_await this_coro::executor; @@ -109,7 +111,7 @@ awaitable resp3() p.quit(); r.push_back({"OK"}); - co_await async_write(socket, buffer(p.payload)); + co_await async_write(socket, net::buffer(p.payload)); resp::buffer buffer; for (auto const& o : r) { @@ -120,58 +122,6 @@ awaitable resp3() } } -struct initiate_async_receive { - using executor_type = net::system_executor; - - std::string const& payload; - - executor_type get_executor() noexcept - { return net::system_executor(); } - - template < - class ReadHandler, - class MutableBufferSequence> - void operator()(ReadHandler&& handler, - MutableBufferSequence const& buffers) const - { - boost::system::error_code ec; - if (std::size(buffers) == 0) { - handler(ec, 0); - return; - } - - assert(std::size(buffers) != 0); - auto begin = boost::asio::buffer_sequence_begin(buffers); - assert(std::size(payload) <= std::size(*begin)); - char* p = static_cast(begin->data()); - std::copy(std::begin(payload), std::end(payload), p); - handler(ec, std::size(payload)); - } -}; - -struct test_stream { - std::string const& payload; - - using executor_type = net::system_executor; - - template< - class MutableBufferSequence, - class ReadHandler = - net::default_completion_token_t - > - void async_read_some( - MutableBufferSequence const& buffers, - ReadHandler&& handler) - { - return net::async_initiate( - initiate_async_receive{payload}, handler, buffers); - } - - executor_type get_executor() noexcept - { return net::system_executor(); } -}; - struct test_handler { void operator()(boost::system::error_code ec) const { @@ -192,7 +142,7 @@ void send(std::string cmd) ioc.run(); } -void offline() +net::awaitable offline() { // Redis answer - Expected vector. std::vector>> payloads @@ -203,24 +153,24 @@ void offline() , {{"-Error\r\n"}, {"Error"}} }; + resp::buffer buffer; for (auto const& e : payloads) { - test_stream ts {e.first}; - resp::buffer buffer; - resp::response res; - async_read(ts, buffer, res, test_handler {}); - if (e.second != res.res) - std::cout << "Error" << std::endl; - else - std::cout << "Success: Offline tests." << std::endl; + test_tcp_socket ts {e.first}; + resp::response res; + co_await resp::async_read(ts, buffer, res); + if (e.second != res.res) + std::cout << "Error" << std::endl; + else + std::cout << "Success: Offline tests." << std::endl; } } int main(int argc, char* argv[]) { //send(ping()); - offline(); - io_context ioc {1}; - co_spawn(ioc, test1(), detached); + net::io_context ioc {1}; + co_spawn(ioc, offline(), net::detached); + co_spawn(ioc, test1(), net::detached); //co_spawn(ioc, resp3(), detached); ioc.run(); } diff --git a/tests/test_stream.hpp b/tests/test_stream.hpp new file mode 100644 index 00000000..ce2c2f7f --- /dev/null +++ b/tests/test_stream.hpp @@ -0,0 +1,70 @@ +/* Copyright (c) 2019 Marcelo Zimbres Silva (mzimbres at gmail dot com) + * + * This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this + * file, You can obtain one at https://mozilla.org/MPL/2.0/. + */ + +#include + +namespace aedis { + +struct initiate_async_receive { + using executor_type = aedis::net::system_executor; + + std::string const& payload; + + executor_type get_executor() noexcept + { return aedis::net::system_executor(); } + + template < + class ReadHandler, + class MutableBufferSequence> + void operator()(ReadHandler&& handler, + MutableBufferSequence const& buffers) const + { + boost::system::error_code ec; + if (std::size(buffers) == 0) { + handler(ec, 0); + return; + } + + assert(std::size(buffers) != 0); + auto begin = boost::asio::buffer_sequence_begin(buffers); + assert(std::size(payload) <= std::size(*begin)); + char* p = static_cast(begin->data()); + std::copy(std::begin(payload), std::end(payload), p); + handler(ec, std::size(payload)); + } +}; + +template +struct test_stream { + std::string const& payload; + + using executor_type = Executor; + + template< + class MutableBufferSequence, + class ReadHandler = + aedis::net::default_completion_token_t + > + auto async_read_some( + MutableBufferSequence const& buffers, + ReadHandler&& handler = net::default_completion_token_t{}) + { + return aedis::net::async_initiate( + initiate_async_receive{payload}, handler, buffers); + } + + executor_type get_executor() noexcept + { return aedis::net::system_executor(); } + + template + struct rebind_executor { + using other = test_stream; + }; +}; +} +