|
6 | 6 |
|
7 | 7 | #include <iostream>
|
8 | 8 |
|
| 9 | +TEST_CASE("tcp_server", "[tcp_server]") |
| 10 | +{ |
| 11 | + std::cerr << "[tcp_server]\n\n"; |
| 12 | +} |
| 13 | + |
9 | 14 | TEST_CASE("tcp_server ping server", "[tcp_server]")
|
10 | 15 | {
|
| 16 | + std::cerr << "BEGIN tcp_server ping server\n"; |
11 | 17 | const std::string client_msg{"Hello from client"};
|
12 | 18 | const std::string server_msg{"Reply from server!"};
|
13 | 19 |
|
@@ -89,10 +95,12 @@ TEST_CASE("tcp_server ping server", "[tcp_server]")
|
89 | 95 |
|
90 | 96 | coro::sync_wait(coro::when_all(
|
91 | 97 | make_server_task(scheduler, client_msg, server_msg), make_client_task(scheduler, client_msg, server_msg)));
|
| 98 | + std::cerr << "END tcp_server ping server\n"; |
92 | 99 | }
|
93 | 100 |
|
94 | 101 | TEST_CASE("tcp_server concurrent polling on the same socket", "[tcp_server]")
|
95 | 102 | {
|
| 103 | + std::cerr << "BEGIN tcp_server concurrent polling on the same socket\n"; |
96 | 104 | // Issue 224: This test duplicates a client and issues two different poll operations per coroutine.
|
97 | 105 |
|
98 | 106 | using namespace std::chrono_literals;
|
@@ -173,32 +181,45 @@ TEST_CASE("tcp_server concurrent polling on the same socket", "[tcp_server]")
|
173 | 181 | auto response = std::move(std::get<1>(result).return_value());
|
174 | 182 |
|
175 | 183 | REQUIRE(request == response);
|
| 184 | + std::cerr << "END tcp_server concurrent polling on the same socket\n"; |
176 | 185 | }
|
177 | 186 |
|
178 | 187 | TEST_CASE("tcp_server graceful shutdown via socket", "[tcp_server]")
|
179 | 188 | {
|
| 189 | + std::cerr << "BEGIN tcp_server graceful shutdown via socket\n"; |
180 | 190 | auto scheduler = coro::io_scheduler::make_shared(coro::io_scheduler::options{
|
181 | 191 | .execution_strategy = coro::io_scheduler::execution_strategy_t::process_tasks_inline});
|
182 | 192 | coro::net::tcp::server server{scheduler};
|
| 193 | + coro::event started{}; |
183 | 194 |
|
184 |
| - auto make_accept_task = [](coro::net::tcp::server& server) -> coro::task<void> |
| 195 | + auto make_accept_task = [](coro::net::tcp::server& server, coro::event& started) -> coro::task<void> |
185 | 196 | {
|
186 | 197 | std::cerr << "make accept task start\n";
|
187 |
| - auto poll_result = co_await server.poll(std::chrono::seconds{3}); |
| 198 | + started.set(); |
| 199 | + auto poll_result = co_await server.poll(); |
188 | 200 | REQUIRE(poll_result == coro::poll_status::closed);
|
189 | 201 | auto client = server.accept();
|
190 | 202 | REQUIRE_FALSE(client.socket().is_valid());
|
191 | 203 | std::cerr << "make accept task completed\n";
|
192 | 204 | };
|
193 | 205 |
|
194 |
| - scheduler->spawn(make_accept_task(server)); |
| 206 | + scheduler->spawn(make_accept_task(server, started)); |
195 | 207 |
|
196 |
| - std::this_thread::sleep_for(std::chrono::milliseconds(100)); |
| 208 | + coro::sync_wait(started); |
| 209 | + // we'll wait a bit to make sure the server.poll() is fully registered. |
| 210 | + std::this_thread::sleep_for(std::chrono::milliseconds(500)); |
197 | 211 |
|
198 | 212 | server.accept_socket().shutdown(coro::poll_op::read_write);
|
199 | 213 |
|
200 | 214 | scheduler->shutdown();
|
| 215 | + std::cerr << "END tcp_server graceful shutdown via socket\n"; |
201 | 216 | }
|
202 | 217 |
|
| 218 | +TEST_CASE("~tcp_server", "[tcp_server]") |
| 219 | +{ |
| 220 | + std::cerr << "[~tcp_server]\n\n"; |
| 221 | +} |
| 222 | + |
| 223 | + |
203 | 224 | #endif // LIBCORO_FEATURE_NETWORKING
|
204 | 225 |
|
0 commit comments