|
1 | | -use std::io::Read; |
2 | 1 | use std::sync::Arc; |
3 | 2 | use std::time::Duration; |
4 | 3 |
|
@@ -216,77 +215,84 @@ fn jmux_proxy_read_hello_world() { |
216 | 215 | client_output.success().stdout("hello world\n"); |
217 | 216 | } |
218 | 217 |
|
219 | | -#[test] |
220 | | -fn jmux_proxy_write_hello_world() { |
| 218 | +#[tokio::test] |
| 219 | +async fn jmux_proxy_write_hello_world() { |
| 220 | + use tokio::io::AsyncReadExt as _; |
| 221 | + |
221 | 222 | // Find 3 available ports at once to avoid conflicts. |
222 | 223 | let ports = find_unused_ports(3); |
223 | 224 | let read_server_port = ports[0]; |
224 | 225 | let jmux_server_port = ports[1]; |
225 | 226 | let proxy_listen_port = ports[2]; |
226 | 227 |
|
227 | 228 | // Start read server first. |
228 | | - let mut read_server = jetsocat_cmd() |
| 229 | + let mut read_server = jetsocat_tokio_cmd() |
229 | 230 | .env( |
230 | 231 | "JETSOCAT_ARGS", |
231 | 232 | format!("forward tcp-listen://127.0.0.1:{read_server_port} stdio --no-proxy"), |
232 | 233 | ) |
| 234 | + .stdin(std::process::Stdio::null()) |
233 | 235 | .stdout(std::process::Stdio::piped()) |
| 236 | + .kill_on_drop(true) |
234 | 237 | .spawn() |
235 | 238 | .expect("failed to start read server"); |
236 | 239 |
|
237 | | - // Give the read server time to start. |
238 | | - std::thread::sleep(LISTENER_WAIT_DURATION); |
| 240 | + wait_for_port_bound(read_server_port).await.expect("read server ready"); |
239 | 241 |
|
240 | 242 | // Start JMUX server that will accept JMUX connections. |
241 | | - let mut jmux_server = jetsocat_cmd() |
| 243 | + let mut jmux_server = jetsocat_tokio_cmd() |
242 | 244 | .env( |
243 | 245 | "JETSOCAT_ARGS", |
244 | 246 | format!("jmux-proxy tcp-listen://127.0.0.1:{jmux_server_port} --allow-all --no-proxy"), |
245 | 247 | ) |
| 248 | + .kill_on_drop(true) |
246 | 249 | .spawn() |
247 | 250 | .expect("failed to start JMUX server"); |
248 | 251 |
|
249 | | - // Give the JMUX server time to start. |
250 | | - std::thread::sleep(LISTENER_WAIT_DURATION); |
| 252 | + wait_for_port_bound(jmux_server_port).await.expect("JMUX server ready"); |
251 | 253 |
|
252 | 254 | // Start JMUX client proxy that connects to the JMUX server and provides a local TCP listener. |
253 | | - let mut jmux_client = jetsocat_cmd() |
| 255 | + let mut jmux_client = jetsocat_tokio_cmd() |
254 | 256 | .env( |
255 | 257 | "JETSOCAT_ARGS", |
256 | 258 | format!( |
257 | 259 | "jmux-proxy tcp://127.0.0.1:{jmux_server_port} tcp-listen://127.0.0.1:{proxy_listen_port}/127.0.0.1:{read_server_port} --no-proxy", |
258 | 260 | ), |
259 | 261 | ) |
| 262 | + .kill_on_drop(true) |
260 | 263 | .spawn() |
261 | 264 | .expect("failed to start JMUX client"); |
262 | 265 |
|
263 | | - // Give the JMUX client time to establish connection and set up listener. |
264 | | - std::thread::sleep(LISTENER_WAIT_DURATION); |
| 266 | + wait_for_port_bound(proxy_listen_port) |
| 267 | + .await |
| 268 | + .expect("JMUX client proxy ready"); |
265 | 269 |
|
266 | 270 | // Connect to the JMUX client's local listener. |
267 | 271 | jetsocat_assert_cmd() |
268 | 272 | .env( |
269 | 273 | "JETSOCAT_ARGS", |
270 | | - format!("forward tcp://127.0.0.1:{proxy_listen_port} 'cmd://echo hello world'"), |
| 274 | + format!("forward tcp://127.0.0.1:{proxy_listen_port} 'cmd://echo hello world' --no-proxy"), |
271 | 275 | ) |
272 | 276 | .timeout(COMMAND_TIMEOUT) |
273 | 277 | .assert() |
274 | 278 | .success(); |
275 | 279 |
|
276 | 280 | // Kill all processes. |
277 | | - let _ = jmux_client.kill(); |
278 | | - let _ = jmux_server.kill(); |
279 | | - let _ = read_server.kill(); |
280 | | - let _ = jmux_client.wait(); |
281 | | - let _ = jmux_server.wait(); |
282 | | - let _ = read_server.wait(); |
| 281 | + let _ = jmux_client.start_kill(); |
| 282 | + let _ = jmux_server.start_kill(); |
| 283 | + let _ = read_server.start_kill(); |
| 284 | + let _ = jmux_client.wait().await; |
| 285 | + let _ = jmux_server.wait().await; |
| 286 | + let _ = read_server.wait().await; |
283 | 287 |
|
284 | 288 | // Check that the read server received the payload. |
285 | 289 | let mut read_server_stdout = String::new(); |
286 | 290 | read_server |
287 | 291 | .stdout |
| 292 | + .take() |
288 | 293 | .unwrap() |
289 | 294 | .read_to_string(&mut read_server_stdout) |
| 295 | + .await |
290 | 296 | .unwrap(); |
291 | 297 | assert_eq!(read_server_stdout.trim(), "hello world"); |
292 | 298 | } |
|
0 commit comments