|
1 | 1 | use std::path::Path;
|
2 | 2 | use std::os::unix::prelude::*;
|
| 3 | + |
3 | 4 | use nix::fcntl::{O_RDWR, open};
|
4 | 5 | use nix::pty::*;
|
5 | 6 | use nix::sys::stat;
|
| 7 | +use nix::sys::termios::*; |
| 8 | +use nix::unistd::{read, write, close}; |
6 | 9 |
|
7 | 10 | /// Test equivalence of `ptsname` and `ptsname_r`
|
8 | 11 | #[test]
|
@@ -90,3 +93,82 @@ fn test_open_ptty_pair() {
|
90 | 93 | let slave_fd = open(Path::new(&slave_name), O_RDWR, stat::Mode::empty()).unwrap();
|
91 | 94 | assert!(slave_fd > 0);
|
92 | 95 | }
|
| 96 | + |
| 97 | +#[test] |
| 98 | +fn test_openpty() { |
| 99 | + let pty = openpty(None, None).unwrap(); |
| 100 | + assert!(pty.master > 0); |
| 101 | + assert!(pty.slave > 0); |
| 102 | + |
| 103 | + // Writing to one should be readable on the other one |
| 104 | + let string = "foofoofoo\n"; |
| 105 | + let mut buf = [0u8; 16]; |
| 106 | + write(pty.master, string.as_bytes()).unwrap(); |
| 107 | + let len = read(pty.slave, &mut buf).unwrap(); |
| 108 | + |
| 109 | + assert_eq!(len, string.len()); |
| 110 | + assert_eq!(&buf[0..len], string.as_bytes()); |
| 111 | + |
| 112 | + // Read the echo as well |
| 113 | + let echoed_string = "foofoofoo\r\n"; |
| 114 | + let len = read(pty.master, &mut buf).unwrap(); |
| 115 | + assert_eq!(len, echoed_string.len()); |
| 116 | + assert_eq!(&buf[0..len], echoed_string.as_bytes()); |
| 117 | + |
| 118 | + let string2 = "barbarbarbar\n"; |
| 119 | + let echoed_string2 = "barbarbarbar\r\n"; |
| 120 | + write(pty.slave, string2.as_bytes()).unwrap(); |
| 121 | + let len = read(pty.master, &mut buf).unwrap(); |
| 122 | + |
| 123 | + assert_eq!(len, echoed_string2.len()); |
| 124 | + assert_eq!(&buf[0..len], echoed_string2.as_bytes()); |
| 125 | + |
| 126 | + close(pty.master).unwrap(); |
| 127 | + close(pty.slave).unwrap(); |
| 128 | +} |
| 129 | + |
| 130 | +#[test] |
| 131 | +fn test_openpty_with_termios() { |
| 132 | + // Open one pty to get attributes for the second one |
| 133 | + let mut termios = { |
| 134 | + let pty = openpty(None, None).unwrap(); |
| 135 | + assert!(pty.master > 0); |
| 136 | + assert!(pty.slave > 0); |
| 137 | + let termios = tcgetattr(pty.master).unwrap(); |
| 138 | + close(pty.master).unwrap(); |
| 139 | + close(pty.slave).unwrap(); |
| 140 | + termios |
| 141 | + }; |
| 142 | + termios.c_oflag &= !ONLCR; |
| 143 | + |
| 144 | + let pty = openpty(None, &termios).unwrap(); |
| 145 | + // Must be valid file descriptors |
| 146 | + assert!(pty.master > 0); |
| 147 | + assert!(pty.slave > 0); |
| 148 | + |
| 149 | + // Writing to one should be readable on the other one |
| 150 | + let string = "foofoofoo\n"; |
| 151 | + let mut buf = [0u8; 16]; |
| 152 | + write(pty.master, string.as_bytes()).unwrap(); |
| 153 | + let len = read(pty.slave, &mut buf).unwrap(); |
| 154 | + |
| 155 | + assert_eq!(len, string.len()); |
| 156 | + assert_eq!(&buf[0..len], string.as_bytes()); |
| 157 | + |
| 158 | + // read the echo as well |
| 159 | + let echoed_string = "foofoofoo\n"; |
| 160 | + let len = read(pty.master, &mut buf).unwrap(); |
| 161 | + assert_eq!(len, echoed_string.len()); |
| 162 | + assert_eq!(&buf[0..len], echoed_string.as_bytes()); |
| 163 | + |
| 164 | + let string2 = "barbarbarbar\n"; |
| 165 | + let echoed_string2 = "barbarbarbar\n"; |
| 166 | + write(pty.slave, string2.as_bytes()).unwrap(); |
| 167 | + let len = read(pty.master, &mut buf).unwrap(); |
| 168 | + |
| 169 | + assert_eq!(len, echoed_string2.len()); |
| 170 | + assert_eq!(&buf[0..len], echoed_string2.as_bytes()); |
| 171 | + |
| 172 | + close(pty.master).unwrap(); |
| 173 | + close(pty.slave).unwrap(); |
| 174 | +} |
0 commit comments