|
| 1 | +#[test] |
| 2 | +fn test_termios_flush() { |
| 3 | + use rustix::pty::*; |
| 4 | + use rustix::termios::*; |
| 5 | + |
| 6 | + let pty = match openpt(OpenptFlags::empty()) { |
| 7 | + Ok(pty) => pty, |
| 8 | + Err(rustix::io::Errno::NOSYS) => return, |
| 9 | + Err(e) => Err(e).unwrap(), |
| 10 | + }; |
| 11 | + let tio = match tcgetattr(&pty) { |
| 12 | + Ok(tio) => tio, |
| 13 | + Err(rustix::io::Errno::NOSYS) => return, |
| 14 | + #[cfg(apple)] |
| 15 | + Err(rustix::io::Errno::NOTTY) => return, |
| 16 | + Err(e) => Err(e).unwrap(), |
| 17 | + }; |
| 18 | + tcsetattr(&pty, OptionalActions::Now, &tio).unwrap(); |
| 19 | + |
| 20 | + tcflush(&pty, QueueSelector::IOFlush).unwrap(); |
| 21 | +} |
| 22 | + |
| 23 | +#[test] |
| 24 | +fn test_termios_drain() { |
| 25 | + use rustix::pty::*; |
| 26 | + use rustix::termios::*; |
| 27 | + |
| 28 | + let pty = match openpt(OpenptFlags::empty()) { |
| 29 | + Ok(pty) => pty, |
| 30 | + Err(rustix::io::Errno::NOSYS) => return, |
| 31 | + Err(e) => Err(e).unwrap(), |
| 32 | + }; |
| 33 | + let tio = match tcgetattr(&pty) { |
| 34 | + Ok(tio) => tio, |
| 35 | + Err(rustix::io::Errno::NOSYS) => return, |
| 36 | + #[cfg(apple)] |
| 37 | + Err(rustix::io::Errno::NOTTY) => return, |
| 38 | + Err(e) => Err(e).unwrap(), |
| 39 | + }; |
| 40 | + tcsetattr(&pty, OptionalActions::Now, &tio).unwrap(); |
| 41 | + |
| 42 | + tcdrain(&pty).unwrap(); |
| 43 | +} |
| 44 | + |
| 45 | +#[test] |
| 46 | +fn test_termios_winsize() { |
| 47 | + use rustix::pty::*; |
| 48 | + use rustix::termios::*; |
| 49 | + |
| 50 | + let pty = match openpt(OpenptFlags::empty()) { |
| 51 | + Ok(pty) => pty, |
| 52 | + Err(rustix::io::Errno::NOSYS) => return, |
| 53 | + Err(e) => Err(e).unwrap(), |
| 54 | + }; |
| 55 | + |
| 56 | + // Sizes for a pseudoterminal start out 0. |
| 57 | + let mut sizes = match tcgetwinsize(&pty) { |
| 58 | + Ok(sizes) => sizes, |
| 59 | + // Apple doesn't appear to support `tcgetwinsize` on a pty. |
| 60 | + #[cfg(apple)] |
| 61 | + Err(rustix::io::Errno::NOTTY) => return, |
| 62 | + Err(err) => Err(err).unwrap(), |
| 63 | + }; |
| 64 | + assert_eq!(sizes.ws_row, 0); |
| 65 | + assert_eq!(sizes.ws_col, 0); |
| 66 | + assert_eq!(sizes.ws_xpixel, 0); |
| 67 | + assert_eq!(sizes.ws_ypixel, 0); |
| 68 | + |
| 69 | + // Set some arbitrary sizes. |
| 70 | + sizes.ws_row = 28; |
| 71 | + sizes.ws_col = 82; |
| 72 | + sizes.ws_xpixel = 365; |
| 73 | + sizes.ws_ypixel = 794; |
| 74 | + tcsetwinsize(&pty, sizes).unwrap(); |
| 75 | + |
| 76 | + // Check that the sizes roundtripped. |
| 77 | + let check_sizes = tcgetwinsize(&pty).unwrap(); |
| 78 | + assert_eq!(check_sizes.ws_row, sizes.ws_row); |
| 79 | + assert_eq!(check_sizes.ws_col, sizes.ws_col); |
| 80 | + assert_eq!(check_sizes.ws_xpixel, sizes.ws_xpixel); |
| 81 | + assert_eq!(check_sizes.ws_ypixel, sizes.ws_ypixel); |
| 82 | +} |
| 83 | + |
1 | 84 | // Disable on illumos where `tcgetattr` doesn't appear to support |
2 | 85 | // pseudoterminals. |
3 | 86 | #[cfg(not(target_os = "illumos"))] |
@@ -86,3 +169,12 @@ fn test_termios_speeds() { |
86 | 169 | assert_eq!(new_tio.output_speed(), speed::B110); |
87 | 170 | } |
88 | 171 | } |
| 172 | + |
| 173 | +#[test] |
| 174 | +fn test_termios_tcgetattr_not_tty() { |
| 175 | + let file = tempfile::tempfile().unwrap(); |
| 176 | + assert_eq!( |
| 177 | + rustix::termios::tcgetattr(&file).unwrap_err(), |
| 178 | + rustix::io::Errno::NOTTY |
| 179 | + ); |
| 180 | +} |
0 commit comments