diff --git a/async-ssh2-lite/tests/integration_tests.rs b/async-ssh2-lite/tests/integration_tests.rs index 534e44f..46ff613 100644 --- a/async-ssh2-lite/tests/integration_tests.rs +++ b/async-ssh2-lite/tests/integration_tests.rs @@ -31,4 +31,7 @@ mod integration_tests { #[cfg(test)] mod sftp; + + #[cfg(test)] + mod tokio_spawn_session; } diff --git a/async-ssh2-lite/tests/integration_tests/channel__exec.rs b/async-ssh2-lite/tests/integration_tests/channel__exec.rs index 0e2dcaf..f16a56a 100644 --- a/async-ssh2-lite/tests/integration_tests/channel__exec.rs +++ b/async-ssh2-lite/tests/integration_tests/channel__exec.rs @@ -45,17 +45,23 @@ async fn __run__session__channel_session__exec Result<(), Box> { + let mut session = + AsyncSession::::connect(get_connect_addr()?, None).await?; + __run__session__userauth_pubkey_file(&mut session).await?; + let session = Arc::new(session); + + let mut handles = vec![]; + for i in 0..10 { + let session = session.clone(); + let handle = tokio::spawn(async move { + __run__session__channel_session__exec(&session, i) + .await + .unwrap(); + }); + handles.push(handle); + } + + for handle in handles { + handle.await.unwrap(); + } + + Ok(()) +} + +// +#[tokio::test] +async fn concurrently_with_tokio() -> Result<(), Box> { + let mut session = + AsyncSession::::connect(get_connect_addr()?, None).await?; + __run__session__userauth_pubkey_file(&mut session).await?; + let session = Arc::new(session); + + let mut handles = vec![]; + for i in 0..10 { + let session = session.clone(); + let handle = tokio::spawn(async move { + __run__session__channel_session__exec(&session, i) + .await + .unwrap(); + }); + handles.push(handle); + } + + let rets = join_all(handles).await; + println!("tokio_spawn_session concurrently rets:{rets:?}"); + assert!(rets.iter().all(|x| x.is_ok())); + + Ok(()) +} + +async fn __run__session__channel_session__exec( + session: &AsyncSession, + i: usize, +) -> Result<(), Box> { + let mut channel = session.channel_session().await?; + channel.exec("hostname").await?; + let mut s = String::new(); + channel.read_to_string(&mut s).await?; + println!("tokio_spawn_session exec hostname output:{s} i:{i}"); + channel.close().await?; + println!( + "tokio_spawn_session exec hostname exit_status:{} i:{i}", + channel.exit_status()? + ); + + let mut channel = session.channel_session().await?; + channel.exec("head -c 16354 /dev/random").await?; + let mut b = vec![]; + channel.read_to_end(&mut b).await?; + assert_eq!(b.len(), 16354); + channel.close().await?; + println!( + "tokio_spawn_session exec head exit_status:{} i:{i}", + channel.exit_status()? + ); + + Ok(()) +}