2
0
mirror of https://github.com/boostorg/cobalt.git synced 2026-01-23 05:22:14 +00:00
Files
cobalt/test/io/pipe.cpp
2025-06-24 18:15:10 +08:00

221 lines
7.5 KiB
C++

//
// Copyright (c) 2025 Klemens Morgenstern (klemens.morgenstern@gmx.net)
//
// 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 "../test.hpp"
#include <boost/cobalt/io/pipe.hpp>
#include <boost/cobalt/io/read.hpp>
#include <boost/cobalt/io/write.hpp>
#include <boost/cobalt/join.hpp>
#include <boost/cobalt/promise.hpp>
using namespace boost;
BOOST_AUTO_TEST_SUITE(pipe_);
CO_TEST_CASE(rw_some)
{
auto p = cobalt::io::pipe();
BOOST_REQUIRE(p);
auto &[r, w] = *p;
std::string input;
input.resize(14);
std::array<char[7], 2u> output;
std::memcpy(output[0], "Hello, ", 7);
std::memcpy(output[1], " World!", 7);
std::array<cobalt::io::const_buffer, 2u> outbuf = {cobalt::io::buffer(output[0]), cobalt::io::buffer(output[1])};
BOOST_CHECK_EQUAL(cobalt::io::buffer_size(outbuf), 14u);
cobalt::io::const_buffer_sequence cbs(outbuf);
BOOST_CHECK(!cbs.is_registered());
auto itr = cbs.begin();
BOOST_CHECK(itr == cbs.begin());
BOOST_CHECK(itr->data() == &output[0]);
BOOST_CHECK_EQUAL(itr->size(), 7u);
itr++;
BOOST_CHECK(itr->data() == &output[1]);
BOOST_CHECK_EQUAL(itr->size(), 7u);
itr++;
BOOST_CHECK(itr == cbs.end());
BOOST_CHECK_EQUAL(cbs.buffer_count(), 2u);
cobalt::io::const_buffer_sequence seq{outbuf};
while (asio::buffer_size(seq) > 0)
seq += co_await w.write_some(seq);
auto bf = cobalt::io::buffer(input);
while (asio::buffer_size(bf) > 0)
bf += co_await r.read_some(bf);
BOOST_CHECK_EQUAL(input, "Hello, World!");
//BOOST_CHECK_EQUAL(rs, 14);
//BOOST_CHECK_EQUAL(ws, 14);
}
BOOST_AUTO_TEST_CASE(rw_sync)
{
asio::io_context ctx;
cobalt::executor exec{ctx.get_executor()};
auto p = cobalt::io::pipe(exec);
BOOST_REQUIRE(p);
auto & [r, w] = *p;
std::string input;
input.resize(14);
std::array<char[7], 2u> output;
std::memcpy(output[0], "Hello, ", 7);
std::memcpy(output[1], " World!", 7);
std::array<cobalt::io::const_buffer, 2u> outbuf = {cobalt::io::buffer(output[0]), cobalt::io::buffer(output[1])};
BOOST_CHECK_EQUAL(cobalt::io::buffer_size(outbuf), 14u);
BOOST_CHECK(!cobalt::io::const_buffer_sequence(outbuf).is_registered());
BOOST_CHECK_EQUAL(cobalt::io::const_buffer_sequence(outbuf).begin()->data(), &output[0]);
BOOST_CHECK_EQUAL(cobalt::io::const_buffer_sequence(outbuf).begin()->size(),7u);
BOOST_CHECK_EQUAL(std::next(cobalt::io::const_buffer_sequence(outbuf).begin())->data(), &output[1]);
BOOST_CHECK_EQUAL(std::next(cobalt::io::const_buffer_sequence(outbuf).begin())->size(),7u);
BOOST_CHECK_EQUAL(cobalt::io::const_buffer_sequence(outbuf).buffer_count(), 2u);
auto w_op = cobalt::io::write(w, outbuf);
BOOST_CHECK(!w_op.step.buffer.is_registered());
BOOST_CHECK_EQUAL(w_op.step.buffer.buffer_count(), 2u);
auto itr = w_op.step.buffer.begin();
BOOST_CHECK_EQUAL(itr->data(), &output[0]);
BOOST_CHECK_EQUAL(itr->size(),7u);
itr++;
BOOST_CHECK_EQUAL(itr->data(), &output[1]);
BOOST_CHECK_EQUAL(itr->size(), 7u);
itr++;
auto end = w_op.step.buffer.end();
BOOST_CHECK(itr == end);
BOOST_CHECK_EQUAL(boost::cobalt::io::buffer_size(w_op.step.buffer), 14u);
auto bb = w_op.step.buffer;
BOOST_CHECK(!w_op.step.buffer.is_registered());
BOOST_CHECK_EQUAL(bb.buffer_count(), 2u);
BOOST_CHECK_EQUAL(bb.begin()->data(), &output[0]);
BOOST_CHECK_EQUAL(bb.begin()->size(),7u);
BOOST_CHECK_EQUAL(std::next(bb.begin())->data(), &output[1]);
BOOST_CHECK_EQUAL(std::next(bb.begin())->size(),7u);
BOOST_CHECK_EQUAL(boost::cobalt::io::buffer_size(bb), 14u);
auto r_op = cobalt::io::read(r, cobalt::io::buffer(input));
BOOST_CHECK(!r_op.step.buffer.is_registered());
BOOST_CHECK_EQUAL(r_op.step.buffer.buffer_count(), 1u);
BOOST_CHECK_EQUAL(r_op.step.buffer.begin()->data(), input.data());
BOOST_CHECK_EQUAL(r_op.step.buffer.begin()->size(), input.size());
BOOST_CHECK_EQUAL(boost::cobalt::io::buffer_size(r_op.step.buffer), 14u);
}
CO_TEST_CASE(rw)
{
auto p = cobalt::io::pipe();
BOOST_REQUIRE(p);
auto & [r, w] = *p;
std::string input;
input.resize(14);
std::array<char[7], 2u> output;
std::memcpy(output[0], "Hello, ", 7);
std::memcpy(output[1], " World!", 7);
std::array<cobalt::io::const_buffer, 2u> outbuf = {cobalt::io::buffer(output[0]), cobalt::io::buffer(output[1])};
BOOST_CHECK_EQUAL(cobalt::io::buffer_size(outbuf), 14u);
BOOST_CHECK(!cobalt::io::const_buffer_sequence(outbuf).is_registered());
BOOST_CHECK_EQUAL(cobalt::io::const_buffer_sequence(outbuf).begin()->data(), &output[0]);
BOOST_CHECK_EQUAL(cobalt::io::const_buffer_sequence(outbuf).begin()->size(),7u);
BOOST_CHECK_EQUAL(std::next(cobalt::io::const_buffer_sequence(outbuf).begin())->data(), &output[1]);
BOOST_CHECK_EQUAL(std::next(cobalt::io::const_buffer_sequence(outbuf).begin())->size(),7u);
BOOST_CHECK_EQUAL(cobalt::io::const_buffer_sequence(outbuf).buffer_count(), 2u);
auto w_op = cobalt::io::write(w, outbuf);
BOOST_CHECK(!w_op.step.buffer.is_registered());
BOOST_CHECK_EQUAL(w_op.step.buffer.buffer_count(), 2u);
auto itr = w_op.step.buffer.begin();
BOOST_CHECK_EQUAL(itr->data(), &output[0]);
BOOST_CHECK_EQUAL(itr->size(),7u);
itr++;
BOOST_CHECK_EQUAL(itr->data(), &output[1]);
BOOST_CHECK_EQUAL(itr->size(), 7u);
itr++;
auto end = w_op.step.buffer.end();
BOOST_CHECK(itr == end);
BOOST_CHECK_EQUAL(boost::cobalt::io::buffer_size(w_op.step.buffer), 14u);
auto r_op = cobalt::io::read(r, cobalt::io::buffer(input));
BOOST_CHECK(!r_op.step.buffer.is_registered());
BOOST_CHECK_EQUAL(r_op.step.buffer.buffer_count(), 1u);
BOOST_CHECK_EQUAL(r_op.step.buffer.begin()->data(), input.data());
BOOST_CHECK_EQUAL(r_op.step.buffer.begin()->size(), input.size());
BOOST_CHECK_EQUAL(boost::cobalt::io::buffer_size(r_op.step.buffer), 14u);
BOOST_TEST_CHECKPOINT("Preparing await");
const auto ws = co_await w_op;
const auto rs = co_await r_op;
BOOST_TEST_CHECKPOINT("Performed await");
BOOST_CHECK_EQUAL(input, "Hello, World!");
BOOST_CHECK_EQUAL(rs, 14);
BOOST_CHECK_EQUAL(ws, 14);
}
CO_TEST_CASE(rw_join)
{
auto p = cobalt::io::pipe();
BOOST_REQUIRE(p);
auto & [r, w] = *p;
std::string input;
input.resize(14);
std::array<char[7], 2u> output;
std::memcpy(output[0], "Hello, ", 7);
std::memcpy(output[1], " World!", 7);
std::array<cobalt::io::const_buffer, 2u> outbuf = {cobalt::io::buffer(output[0]), cobalt::io::buffer(output[1])};
auto w_op = cobalt::io::write(w, outbuf);
BOOST_CHECK(!w_op.step.buffer.is_registered());
BOOST_CHECK_EQUAL(w_op.step.buffer.buffer_count(), 2u);
auto itr = w_op.step.buffer.begin();
BOOST_CHECK_EQUAL(itr->data(), &output[0]);
BOOST_CHECK_EQUAL(itr->size(),7u);
itr++;
BOOST_CHECK_EQUAL(itr->data(), &output[1]);
BOOST_CHECK_EQUAL(itr->size(), 7u);
itr++;
auto end = w_op.step.buffer.end();
BOOST_CHECK(itr == end);
BOOST_CHECK_EQUAL(boost::cobalt::io::buffer_size(w_op.step.buffer), 14u);
auto r_op = cobalt::io::read(r, cobalt::io::buffer(input));
BOOST_CHECK(!r_op.step.buffer.is_registered());
BOOST_CHECK_EQUAL(r_op.step.buffer.buffer_count(), 1u);
BOOST_CHECK_EQUAL(r_op.step.buffer.begin()->data(), input.data());
BOOST_CHECK_EQUAL(r_op.step.buffer.begin()->size(), input.size());
BOOST_CHECK_EQUAL(boost::cobalt::io::buffer_size(r_op.step.buffer), 14u);
auto res = co_await cobalt::join(w_op, r_op);
auto & [rs, ws] = res;
BOOST_CHECK_EQUAL(input, "Hello, World!");
BOOST_CHECK_EQUAL(rs, 14);
BOOST_CHECK_EQUAL(ws, 14);
}
BOOST_AUTO_TEST_SUITE_END();