aboutsummaryrefslogblamecommitdiffstats
path: root/tests/split.rs
blob: 4799c138281db5cad60d666f8907a258ab663a3c (plain) (tree)
1
2
3
4
5
6
7
8


                         
              
                       


                                        































                                                                      


                         
              
                            

                                                              




















                                                                      
         







                                                          







                                                   
                                             
         

















                                                              
 

                                         


                         
              























                                                                          
 
mod helpers;

#[cfg(feature = "async")]
#[tokio::test]
async fn test_split() {
    use futures::stream::StreamExt as _;
    use tokio::io::AsyncWriteExt as _;

    let mut pty = pty_process::Pty::new().unwrap();
    let pts = pty.pts().unwrap();
    pty.resize(pty_process::Size::new(24, 80)).unwrap();
    let mut cmd = pty_process::Command::new("perl");
    cmd.args(["-plE", "BEGIN { $SIG{WINCH} = sub { say 'WINCH' } }"]);
    let mut child = cmd.spawn(&pts).unwrap();

    {
        pty.write_all(b"foo\n").await.unwrap();
        let (pty_r, _) = pty.split();
        let mut output = helpers::output_async(pty_r);
        assert_eq!(output.next().await.unwrap(), "foo\r\n");
        assert_eq!(output.next().await.unwrap(), "foo\r\n");
    }

    {
        let (pty_r, mut pty_w) = pty.split();
        pty_w.write_all(b"foo\n").await.unwrap();
        let mut output = helpers::output_async(pty_r);
        assert_eq!(output.next().await.unwrap(), "foo\r\n");
        assert_eq!(output.next().await.unwrap(), "foo\r\n");
    }

    {
        let (pty_r, pty_w) = pty.split();
        pty_w.resize(pty_process::Size::new(25, 80)).unwrap();
        let mut output = helpers::output_async(pty_r);
        assert_eq!(output.next().await.unwrap(), "WINCH\r\n");
    }

    pty.write_all(&[4u8]).await.unwrap();
    child.wait().await.unwrap();
}

#[cfg(feature = "async")]
#[tokio::test]
async fn test_into_split() {
    use tokio::io::{AsyncBufReadExt as _, AsyncWriteExt as _};

    let mut pty = pty_process::Pty::new().unwrap();
    let pts = pty.pts().unwrap();
    pty.resize(pty_process::Size::new(24, 80)).unwrap();
    let mut cmd = pty_process::Command::new("perl");
    cmd.args(["-plE", "BEGIN { $SIG{WINCH} = sub { say 'WINCH' } }"]);
    let mut child = cmd.spawn(&pts).unwrap();

    {
        pty.write_all(b"foo\n").await.unwrap();
        let (pty_r, pty_w) = pty.into_split();
        let mut ptybuf = tokio::io::BufReader::new(pty_r);
        for _ in 0..2 {
            let mut buf = vec![];
            tokio::time::timeout(
                std::time::Duration::from_secs(5),
                ptybuf.read_until(b'\n', &mut buf),
            )
            .await
            .unwrap()
            .unwrap();
            assert_eq!(&buf[..], b"foo\r\n");
        }
        pty = ptybuf.into_inner().unsplit(pty_w).unwrap();
    }

    {
        let (pty_r, mut pty_w) = pty.into_split();
        pty_w.write_all(b"foo\n").await.unwrap();
        let mut ptybuf = tokio::io::BufReader::new(pty_r);
        for _ in 0..2 {
            let mut buf = vec![];
            tokio::time::timeout(
                std::time::Duration::from_secs(5),
                ptybuf.read_until(b'\n', &mut buf),
            )
            .await
            .unwrap()
            .unwrap();
            assert_eq!(&buf[..], b"foo\r\n");
        }
        pty = ptybuf.into_inner().unsplit(pty_w).unwrap();
    }

    {
        let (pty_r, pty_w) = pty.into_split();
        pty_w.resize(pty_process::Size::new(25, 80)).unwrap();
        let mut ptybuf = tokio::io::BufReader::new(pty_r);
        let mut buf = vec![];
        tokio::time::timeout(
            std::time::Duration::from_secs(5),
            ptybuf.read_until(b'\n', &mut buf),
        )
        .await
        .unwrap()
        .unwrap();
        assert_eq!(&buf[..], b"WINCH\r\n");
        pty = ptybuf.into_inner().unsplit(pty_w).unwrap();
    }

    pty.write_all(&[4u8]).await.unwrap();
    child.wait().await.unwrap();
}

#[cfg(feature = "async")]
#[tokio::test]
async fn test_into_split_error() {
    let pty1 = pty_process::Pty::new().unwrap();
    let pty2 = pty_process::Pty::new().unwrap();

    let (pty1_r, pty1_w) = pty1.into_split();
    let (pty2_r, pty2_w) = pty2.into_split();

    let (pty1_r, pty2_w) = if let Err(pty_process::Error::Unsplit(r, w)) =
        pty1_r.unsplit(pty2_w)
    {
        (r, w)
    } else {
        panic!("fail");
    };
    let (pty2_r, pty1_w) = if let Err(pty_process::Error::Unsplit(r, w)) =
        pty2_r.unsplit(pty1_w)
    {
        (r, w)
    } else {
        panic!("fail");
    };

    let _pty1 = pty1_r.unsplit(pty1_w).unwrap();
    let _pty2 = pty2_r.unsplit(pty2_w).unwrap();
}